我正在查看ng-blur
的一个自定义实现(我知道它现在已经在标准的AngularJS中可用)。最后一行是我不明白的。
.controller('formController', function($scope){
$scope.formData = {};
$scope.myFunc = function(){
alert('mew');
console.log(arguments.length);
}
})
.directive('mew', function($parse){
return function(scope, element, attr){
var fn = $parse(attr['mew']);
element.bind('blur', function(event){
scope.$apply(function(){
fn(scope);
});
});
}
});
在视图中,有一个简单的mew="myFunc()"
应用于输入。
我的问题是为什么我们将范围传递给指令最后一行的函数。我试图让它在没有它的情况下工作,但它没有。实际发生了什么?
这也有效scope.$apply(attr.mew)
。相同的原因或不同的东西?
答案 0 :(得分:0)
$parse
只执行 ,它解析传入的字符串,你需要用当前作用域调用结果函数,否则它怎么知道要调用哪个函数?
scope.$apply
按以下方式运作:
- 使用
$eval()
方法执行表达式。- 执行表达式的任何异常都会转发到
$exceptionHandler
服务。- 使用
醇>$digest()
方法执行表达式后,会立即触发监听侦听器。
scope.$apply(attr.mew)
的原因是由于它正在完成上述所有操作。它正在解析,然后将解析的结果应用于范围。
另一种选择是使用隔离范围将您的指令绑定到mew
attr。
return {
scope: {
mew: '&'
},
link: function (scope, element, attr) {
var fn = scope.mew;
element.bind('blur', function (event) {
scope.$apply(function () {
fn();
});
});
}
}
答案 1 :(得分:0)
对于这个具体的例子,它会起作用,但正如你所说,模糊不在摘要循环中。在大多数用例中,该函数将更改一个或另一个范围内的数据,并且摘要循环应该运行并捕获这些更改。