当 $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.propertiesservice.selectedProperty 都可以更改。手表最终会同时观看 service.propertiesservice.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 表达式设置不正确,您可能想要观看更通用的表达式。