Javascript 有没有办法通过指令来实现这一点?
我可以让指令属性中引用的Javascript 有没有办法通过指令来实现这一点?,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我可以让指令属性中引用的$scope函数运行。问题是我需要捕获指令中涉及的元素,并将其传递给属性中的函数。我还不知道怎么做。隔离指令中的作用域将引发错误,因为有2条指令试图对同一元素执行操作 使用下面的代码,我得到的$event是未定义的,当然是一个错误。有没有办法达到我想要的?或者有更好的办法 <li class="list-group-item row" data-touchstart="darkenBackground($event)" data-touchend="lightenB
$scope
函数运行。问题是我需要捕获指令中涉及的元素,并将其传递给属性中的函数。我还不知道怎么做。隔离指令中的作用域将引发错误,因为有2条指令试图对同一元素执行操作
使用下面的代码,我得到的$event
是未定义的
,当然是一个错误。有没有办法达到我想要的?或者有更好的办法
<li class="list-group-item row" data-touchstart="darkenBackground($event)" data-touchend="lightenBackground($event)">
我是这样工作的,但我不确定这是否是最好/正确的方法:
<li class="list-group-item row" data-touchstart="darkenBackground(event)">
我是这样工作的,但我不确定这是否是最好/正确的方法:
<li class="list-group-item row" data-touchstart="darkenBackground(event)">
问题是:
scope.$apply(attrs.touchstart);
当您直接对角度表达式调用scope.$apply
(这就是attrs.touchstart
的含义)时,它将根据scope
自动计算该表达式,因此scope.$event
(未定义)将传递给回调
要将事件传递给回调,可以使用作用域的第二个参数($eval
)在计算表达式时在作用域上临时包含$event
属性
return {
restrict: 'A',
link: function (scope, elem, attrs) {
elem.bind('touchstart', function (e) {
e.preventDefault();
scope.$apply(function () {
scope.$eval(attrs.touchstart, {$event: e});
});
});
}
};
问题是:
scope.$apply(attrs.touchstart);
当您直接对角度表达式调用scope.$apply
(这就是attrs.touchstart
的含义)时,它将根据scope
自动计算该表达式,因此scope.$event
(未定义)将传递给回调
要将事件传递给回调,可以使用作用域的第二个参数($eval
)在计算表达式时在作用域上临时包含$event
属性
return {
restrict: 'A',
link: function (scope, elem, attrs) {
elem.bind('touchstart', function (e) {
e.preventDefault();
scope.$apply(function () {
scope.$eval(attrs.touchstart, {$event: e});
});
});
}
};
假设隔离作用域满足您的需要,这也是可行的,但是您应该使用
scope.$apply
包装对scope.touchstart
的调用,并且无论何时在angular之外执行与角度相关的操作,例如在DOM事件回调内部执行此操作。@mzulch是的!我本打算这么做的,但在整个故障排除阶段之后忘记添加它。我更新了我的答案。假设隔离作用域满足您的需要,这也可以,但是您应该使用scope.$apply>来包装对scope.touchstart
的调用,并且在angular之外执行与角度相关的操作时(例如在DOM事件回调内部)也可以执行同样的操作。@mzulch是的!我本打算这么做的,但在整个故障排除阶段之后忘记添加它。我更新了我的答案。我更喜欢这个答案,因为我不需要隔离范围。这样,我也可以对touchstart和touchend使用单独的指令。我更喜欢这个答案,因为我不需要隔离范围。这样,我也可以对touchstart和touchend使用单独的指令。