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