将DOM事件添加到Angular指令
Add DOM event to Angular directive
我想将DOM事件附加到指令元素,以便更新范围属性。不幸的是,我找不到一个"干净"的方法来做这件事。我现在唯一能做到这一点的方法是在处理程序中显式调用$apply()
。我知道,这是一种糟糕的做法,但它也阻止我将此代码与本机角度指令共享,例如与ng-click="myDOMEventHandler()"
共享(因为它会触发$apply already in progress
异常。
有没有一种方法可以将DOM事件添加到指令元素中,从而获取对作用域的更改,但不必调用$apply()
?
这里有一个简单的例子来说明我的意思。您也可以编辑此Plunker)。
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()
,那么异常就会消失,作用域属性也会发生更改,但这些更改永远不会显示。
您不必使用scope$在scope.inrement函数内应用,但应该使用
$apply
在element.on('keyup'...))
内,当您绑定角度范围外的事件时
angular.module('myApp', [])
.directive('myDirective', function ($compile) {
return {
link: function (scope, element) {
scope.keystrokes = 0;
var report = angular.element('<div>keystrokes and clicks: {{keystrokes}} <button ng-click="increment()">Or click me</button></div>');
element.after(report);
$compile(report)(scope);
scope.increment = function () {
scope.keystrokes += 1;
};
element.on('keyup', function(){
scope.$apply(function(){
scope.increment();
});
});
}
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp">
<input my-directive="" />
</body>
相关文章:
- 将JSON对象传递给angular指令
- Angular指令在alertify setContent内容中不起作用
- 在其他javascript框架模板中运行angular指令
- 如何动态禁用Angular指令
- 在 Angular 指令中,如何进行回调,其中函数名称位于父范围的变量中
- Angular指令中的最佳实践是将文本输入设置为英尺和英寸的格式
- 不适用于动态数据的Angular指令来自$http
- 这段jquery代码在angular指令中不起作用
- Angular 指令似乎没有使用元素传入的选项执行
- 带有Angular指令的HTML;附加时无法工作
- 如何使用angular指令从html中获取数组
- 如何正确控制Angular指令的$dirty和$pure状态
- 在 Angular 指令中定义一个用于 ng-click 的函数
- HTML 标记在使用 Angular 指令时被视为纯文本
- 当 Angular 指令的名称真正重要时
- 如何将侦听器添加到 Angular 指令中
- 嵌套的Angular指令触发父对象上的作用域函数
- 在ui路由器中以Webpack块的形式懒惰地加载Angular指令
- 超链接;编译angular指令内的模板后无法工作
- 用angular指令构建嵌套树