所以我对范围A进行了观察。当兄弟范围B上的局部变量发生变化时,为什么AngularJS会对其进行评估?范围A的数据模型没有改变。
这是一个最小的例子:
text
变量。text
未显示,因为它在范围A中不可见。控制器:
function Ctrl1($scope) {
console.log($scope); // first scope
// my custom watch expression
var count = 0;
$scope.$watch(function() {
count++;
console.log("call count: " + count);
}, function() {
// the listener does nothing
// I'm just interested in when the watch expression is called
});
}
function Ctrl2($scope) {
console.log($scope); // second scope
}
HTML:
<div ng-app>
<div ng-controller="Ctrl1">
{{text}}
</div>
<div ng-controller="Ctrl2">
<input type="text" ng-model="text"></input>
</div>
</div>
(请在此处尝试此代码:http://jsfiddle.net/s3Wz5/4/)
如果在input元素(范围B)中键入一些文本,则会评估范围A的自定义监视。为什么是这样?为什么AngularJS不知道范围A的数据模型没有任何变化?
更新:一些澄清:
我不想看text
。这是一个与性能相关的问题,想知道为什么要评估手表,即使text
无法从其他范围读取!
答案 0 :(得分:1)
因为在每个摘要周期中评估$watch
。更改ng-model
触发摘要周期的值。此行为与$scope.$digest()
不同,后者仅触发当前和子范围的消化。
我认为ng-model
可能不会在内部使用$scope.$digest()
。它可能会使用一些其他机制来在值更改后触发摘要。