首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用作用域将参数传递到指令回调中。

使用作用域将参数传递到指令回调中。
EN

Stack Overflow用户
提问于 2018-06-22 16:12:15
回答 2查看 702关注 0票数 3

我有一个鼠标轮指令,当鼠标移动时调用它。但是,如何在回调期间传递滚动位置?

代码语言:javascript
复制
export function ngMouseWheelDown() {
    return function (scope: angular.IScope, element, attrs) {
        element.bind("DOMMouseScroll mousewheel onmousewheel",
            function (event) {

                // cross-browser wheel delta
                var event = window.event || event; // old IE support
                var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));

                if (delta < 0) {
                    scope.$apply(function () {
                        scope.$eval(attrs.ngMouseWheelDown);
                    });
                }
            });
    }
}

HTML

代码语言:javascript
复制
<div ng-mouse-wheel-up="$ctrl.scrollEvent($event)"
     ng-mouse-wheel-down="$ctrl.scrollEvent($event)"
     style="overflow-y: auto;">
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-22 19:40:36

使用locals方法的$eval参数:

代码语言:javascript
复制
export function ngMouseWheelDown() {
    return function (scope: angular.IScope, element, attrs) {
        element.bind("DOMMouseScroll mousewheel onmousewheel",
            function (event) {

                // cross-browser wheel delta
                var event = window.event || event; // old IE support
                var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));

                if (delta < 0) {
                    var locals = {$event: event, $delta: delta};
                    scope.$apply(function () {
                        scope.$eval(attrs.ngMouseWheelDown, locals);
                    });
                }
            });
    }
}

用法:

代码语言:javascript
复制
<div ng-mouse-wheel-up="$ctrl.scrollEvent($event, $delta)"
     ng-mouse-wheel-down="$ctrl.scrollEvent($event, $delta)"
     style="overflow-y: auto;">

有关更多信息,请参见- AngularJS范围.$AngularJS引用

票数 3
EN

Stack Overflow用户

发布于 2018-06-22 16:18:57

你不需要评估。AngularJs具有绑定功能--能够从父级到子级(从控制器到指令)计算和传递任何您想要的内容,只需创建像下面这样的作用域指令:

代码语言:javascript
复制
return {
    scope: {handler: '='},
    link: function ($scope, $elem, $attrs){
                 element.bind("", function(event){
                         ...
                         $scope.handler(...);
                  })
           }
}

但是,正如@georgeawg所提到的,创建一个孤立的作用域并不总是一个好主意,因为在一个元素中只能有一个单独的作用域。

因此,为了达到这个目的,您可以使用$parse服务评估属性的回调:

代码语言:javascript
复制
['$parse', function myDirective($parse){return {
     link: function myDirecitveLink($scope, $elem, $attrs) {
               // this is the only expression that can be evaluated whenever 
               // you need
               const handlerExpression = $parse($attrs['myHandlerName']); 

               // this is real handler you can call and pass params
               const readlHandler = handlerExpression($scope); 

               // now you can call your handler with desired params
               realHandler(...);
    }
}}]

这也将为您节省一些CPU,因为您不会创建新的观察者,并且可以完全管理计算表达式的时间和次数。

@georgeawg谢谢你的评论

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50991919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档