我尝试在我需要监视更改的数组上使用$scope.$watchCollection()
方法,以便对其进行一些过滤。当用户使用复选框和按钮在给定数组中的一个或多个这些对象上切换布尔值时,$ watch未被正确触发。但是,如果将objectEquality标志设置为true,则将$watchCollection
更改为$scope.$watch(arr, function(){}, true)
会导致$ watch正常工作。为什么$watchCollection
不会自动使用objectEquality来确定是否进行了更改?
答案 0 :(得分:2)
来自$scope.$watchCollection
的{{3}}:
浅看物体的属性并在任何时候发射 属性改变(对于数组,这意味着观察数组 项目;对于对象图,这意味着观察属性)。如果一个 检测到更改,将触发侦听器回调。
因此对于Array
,它会对Array
的项目执行浅监视,在您的情况下,这意味着如果您添加监视功能将被触发或从Array
中删除项目。如果您有Array
个对象,Angular将不会对这些对象执行深$watch
。
正如@GregL在下面的评论中指出的那样:$scope.$watchCollection
的要点是能够在shallow
或{{{$watch
上Object
Array
1}},因为深$watch
要贵得多,尽管有时需要它。
我要添加到@ GregL评论的唯一内容是我们经常忘记watchExpression
函数的$watch
(第一个参数)也可以是可用于跟踪的函数大型Object
或Array
的一个非常具体部分的变化,在很多情况下我们可以编写该函数而不是使用深$watch
,这将使{{1}更有效率。