Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 性能:当范围模型没有';你没变吗?_Performance_Angularjs_Scope_Watch - Fatal编程技术网

Performance 性能:当范围模型没有';你没变吗?

Performance 性能:当范围模型没有';你没变吗?,performance,angularjs,scope,watch,Performance,Angularjs,Scope,Watch,所以我对作用域a有一个观察。为什么当兄弟作用域B上的局部变量发生变化时AngularJS会对其进行评估?范围A的数据模型没有更改 下面是一个最简单的例子: 示波器a上有一块定制手表 输入元素绑定到范围B的文本变量 请注意,文本未显示,因为它在范围A中不可见 控制器: HTML: {{text}} (请在此处尝试此代码:) 如果在输入元素(范围B)中键入一些文本,则会计算范围A的自定义监视。为什么会这样?为什么AngularJS不知道范围A的数据模型没有任何变化 更新:一些澄清: 我不想看

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

下面是一个最简单的例子:

  • 示波器a上有一块定制手表
  • 输入元素绑定到范围B的
    文本
    变量
  • 请注意,
    文本
    未显示,因为它在范围A中不可见
控制器:

HTML:


{{text}}
(请在此处尝试此代码:)

如果在输入元素(范围B)中键入一些文本,则会计算范围A的自定义监视。为什么会这样?为什么AngularJS不知道范围A的数据模型没有任何变化

更新:一些澄清:
我不想看
文本
。这是一个与性能相关的问题,想知道为什么手表会被评估,即使
text
无法从其他范围读取

因为
$watch
在每个摘要周期中都进行评估。更改触发器摘要周期的值。此行为不同于
$scope.$digest()
,后者仅在当前和子作用域上触发消解


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

如果我理解正确,摘要只调用当前作用域和子作用域中的手表。我在问为什么要在同级作用域上调用它?@Chris当用户更改
ng model
的值时,我认为Angular无法确定属性所附加的作用域级别。因此,无法仅为特定作用域(及其子作用域)触发摘要。@Chris我知道,
$scope.$digest()
仅对当前和子作用域触发摘要,但这并不意味着
ng model
将在内部使用
$digest
。我明白了。这对于更大的网页来说是不幸的=/如果你编辑你的答案来包含你的评论,我会接受它作为答案
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        
}
<div ng-app>
    <div ng-controller="Ctrl1">        
        {{text}}
    </div>
    <div ng-controller="Ctrl2">
        <input type="text" ng-model="text"></input>
    </div>
</div>