性能:为什么当范围模型没有改变时,AngularJS会评估观察?

时间:2014-01-03 19:44:27

标签: performance angularjs scope watch

所以我对范围A进行了观察。当兄弟范围B上的局部变量发生变化时,为什么AngularJS会对其进行评估?范围A的数据模型没有改变。

这是一个最小的例子:

  • 范围A上有自定义监视。
  • input元素绑定到范围B的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无法从其他范围读取!

1 个答案:

答案 0 :(得分:1)

因为在每个摘要周期中评估$watch。更改ng-model触发摘要周期的值。此行为与$scope.$digest()不同,后者仅触发当前和子范围的消化。

我认为ng-model可能不会在内部使用$scope.$digest()。它可能会使用一些其他机制来在值更改后触发摘要。