【发布时间】:2014-11-03 15:53:28
【问题描述】:
我想将 DOM 事件附加到指令元素以更新范围属性。不幸的是,我找不到一种“干净”的方法来做到这一点。我现在可以让它工作的唯一方法是在处理程序中显式调用$apply()。这是不好的做法,我知道,但它也阻止我与本机角度指令共享此代码,例如 ng-click="myDOMEventHandler()"(因为它会触发 $apply already in progress 异常。
有没有办法将 DOM 事件添加到指令元素,以便拾取对范围的更改,而无需调用 $apply()?
这是我的意思的一个简单示例。 You can edit this Plunker as well)。
angular.module('myApp', [])
.directive('myDirective', function ($compile) {
return {
link: function (scope, element) {
scope.keystrokes = 0;
var report = angular.element('<div ng-click="increment()">keystrokes: {{keystrokes}}</div>');
element.after(report);
$compile(report)(scope);
scope.increment = function () {
scope.keystrokes += 1;
scope.$apply();
};
element.on('keyup', scope.increment);
}
};
});
如果您在输入中输入一些文本,计数器会增加。如果你点击按钮,计数器也会增加——但如果会引发$apply already in progress 异常。
如果您删除了scope.$apply(),那么异常就会消失并且范围属性会发生变化,但这些变化永远不会显示出来。
【问题讨论】:
标签: javascript angularjs dom-events