Javascript AngularJS指令隔离作用域行为
我正在学习一些教程,试图巩固我对隔离范围的理解,我遇到了一些问题。我有一个很高的概念,但我试图证明一些我不理解的行为是正确的。按照我的理解,在高层次上,所附选项的工作方式如下: @-允许您输入字符串 &-提供单向数据绑定 =-提供双向数据绑定 因此,考虑到以下准则:Javascript AngularJS指令隔离作用域行为,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我正在学习一些教程,试图巩固我对隔离范围的理解,我遇到了一些问题。我有一个很高的概念,但我试图证明一些我不理解的行为是正确的。按照我的理解,在高层次上,所附选项的工作方式如下: @-允许您输入字符串 &-提供单向数据绑定 =-提供双向数据绑定 因此,考虑到以下准则: <div ng-app="choreApp"> <div ng-controller="ChoreCtrl"> <kid done="logChore(chore)"></kid
<div ng-app="choreApp">
<div ng-controller="ChoreCtrl">
<kid done="logChore(chore)"></kid>
</div>
</div>
var app = angular.module('choreApp', []);
app.controller("ChoreCtrl", function($scope){
$scope.logChore = function(chore){
alert(chore + " is done!");
};
});
app.directive("kid", function() {
return {
restrict: "E",
scope: {
done: "&"
},
template: '<input type="text" ng-model="chore">' +
'{{chore}}' +
'<div class="button" ng-click="done({chore: chore})">I\'m done</div>'
};
});
var-app=angular.module('choreApp',[]);
app.controller(“ChoreCtrl”,函数($scope){
$scope.logChore=函数(chore){
警报(杂务+“完成!”);
};
});
应用指令(“kid”,函数(){
返回{
限制:“E”,
范围:{
完成:“&”
},
模板:“”+
“{{chore}}”+
“我做完了”
};
});
上面的连接正常,使用“&”logChore函数工作,一切正常
“@”不起作用,正如预期的那样,因为它只是在字符串中读取,当我单击“无任何事情发生”时
但是,我也希望“=”可以正常工作,因为它只是一个双向绑定,但是实际发生的情况是函数执行了三次,而我没有执行任何操作(单击),然后它似乎正常工作。为什么函数会执行三次?当您对
done=“logChore(chore)”
使用双向绑定(=”)时,调用logChore(chore)
的结果被分配给done
-而不是函数本身(就像&
那样)
因此,每当Angular调用$watch
以查看它正在监视的任何内容是否已更改时,就会调用函数logChore(chore)
。由于脏检查,$watch
通常会在每个$digest
循环中多次计算监视列表-这就是为什么您看到3次执行(并且在触发$digest
的任何事件发生时,您都会看到更多执行)
要在使用=
时传入函数本身,可以执行以下操作:
<kid done="logChore"></kid>
这是它的工作原理
另外,我不认为@
是传递字符串,而是更广泛地认为它是单向数据绑定。这是单向的,因为父范围的更改将反映在指令中,但指令隔离范围的更改不会反映在父范围中
ng-click="done(chore)"