当 $scope.$watch 表达式依赖于多个变量时会发生什么?
What happens when $scope.$watch expression depends on multiple variables?
如果在我的控制器中,我有类似的东西:
$scope.service = Service;
$scope.$watch('service.properties[service.selectedProperty]', function(newVal,oldVal){});
这里发生了什么? service.properties
和 service.selectedProperty
都可以更改。手表最终会同时观看 service.properties
和 service.selectedProperty
吗?
我已经对此进行了测试,手表似乎会在任何一个变量发生变化时执行,这正是我想要的。我想知道以这种方式使用 .$watch
时是否会产生任何意想不到的后果,以及它实际上是如何工作的。
Does the watch end up watching both service.properties
and service.selectedProperty
?
其实就是在看两者都不,只是对表达式进行整体求值的结果。我解释:
Angular watches 使用脏检查原则:如果 expression 作为一个整体被评估为与上次评估时不同的东西,则发生了变化,关联的处理程序是 运行。 (当您使用 $watch
的形式时,这种行为会更加明显,该形式将函数作为其第一个参数 - 返回要观察的值。)
这意味着 技术上 可能存在这样一种情况,其中 service.properties[service.selectedProperty]
的计算与以前相同,但是 service.properties
,关联对象, 和 service.selectedProperty
,属性 键同时更改了两个(或其中一个)- 然而,表达式被评估为相同。在这种情况下,不会触发更改事件。
例如,给定:
var myObj = {
a: 123,
b: 123
};
var key = 'a';
表达式 myObj[key]
的值将保持不变,即使您将 key
更改为 'b'
而不是 [=20] =].
只要表达式的计算结果相同,从angular的角度来看,什么都没有改变。对于大多数意图和目的而言,这对您来说也不重要 - 如果是这样,您的 watch 表达式设置不正确,您可能想要观看更通用的表达式。
如果在我的控制器中,我有类似的东西:
$scope.service = Service;
$scope.$watch('service.properties[service.selectedProperty]', function(newVal,oldVal){});
这里发生了什么? service.properties
和 service.selectedProperty
都可以更改。手表最终会同时观看 service.properties
和 service.selectedProperty
吗?
我已经对此进行了测试,手表似乎会在任何一个变量发生变化时执行,这正是我想要的。我想知道以这种方式使用 .$watch
时是否会产生任何意想不到的后果,以及它实际上是如何工作的。
Does the watch end up watching both
service.properties
andservice.selectedProperty
?
其实就是在看两者都不,只是对表达式进行整体求值的结果。我解释:
Angular watches 使用脏检查原则:如果 expression 作为一个整体被评估为与上次评估时不同的东西,则发生了变化,关联的处理程序是 运行。 (当您使用 $watch
的形式时,这种行为会更加明显,该形式将函数作为其第一个参数 - 返回要观察的值。)
这意味着 技术上 可能存在这样一种情况,其中 service.properties[service.selectedProperty]
的计算与以前相同,但是 service.properties
,关联对象, 和 service.selectedProperty
,属性 键同时更改了两个(或其中一个)- 然而,表达式被评估为相同。在这种情况下,不会触发更改事件。
例如,给定:
var myObj = {
a: 123,
b: 123
};
var key = 'a';
表达式 myObj[key]
的值将保持不变,即使您将 key
更改为 'b'
而不是 [=20] =].
只要表达式的计算结果相同,从angular的角度来看,什么都没有改变。对于大多数意图和目的而言,这对您来说也不重要 - 如果是这样,您的 watch 表达式设置不正确,您可能想要观看更通用的表达式。