为什么$ scope。$ watch工作但$ scope。$ watchCollection不?

时间:2014-10-15 22:24:03

标签: angularjs

我尝试在我需要监视更改的数组上使用$scope.$watchCollection()方法,以便对其进行一些过滤。当用户使用复选框和按钮在给定数组中的一个或多个这些对象上切换布尔值时,$ watch未被正确触发。但是,如果将objectEquality标志设置为true,则将$watchCollection更改为$scope.$watch(arr, function(){}, true)会导致$ watch正常工作。为什么$watchCollection不会自动使用objectEquality来确定是否进行了更改?

1 个答案:

答案 0 :(得分:2)

来自$scope.$watchCollection的{​​{3}}:

  

浅看物体的属性并在任何时候发射   属性改变(对于数组,这意味着观察数组   项目;对于对象图,这意味着观察属性)。如果一个   检测到更改,将触发侦听器回调。

因此对于Array,它会对Array的项目执行监视,在您的情况下,这意味着如果您添加监视功能将被触发或从Array中删除项目。如果您有Array个对象,Angular将不会对这些对象执行深$watch

正如@GregL在下面的评论中指出的那样:$scope.$watchCollection的要点是能够在shallow或{{{$watchObject Array 1}},因为深$watch要贵得多,尽管有时需要它。

我要添加到@ GregL评论的唯一内容是我们经常忘记watchExpression函数的$watch(第一个参数)也可以是可用于跟踪的函数大型ObjectArray的一个非常具体部分的变化,在很多情况下我们可以编写该函数而不是使用深$watch,这将使{{1}更有效率。