Angularjs 为什么$scope.$watch有效,而$scope.$watchCollection无效?
我尝试在一个数组上使用Angularjs 为什么$scope.$watch有效,而$scope.$watchCollection无效?,angularjs,Angularjs,我尝试在一个数组上使用$scope.$watchCollection()方法,为了在该数组上运行一些过滤,我需要监视该数组的更改。当用户使用复选框和按钮在给定数组中的一个或多个对象上切换布尔值时,$watch未被正确触发。但是,将objectEquality标志设置为true的$watchCollection更改为$scope.$watch(arr,function(){},true),会使$watch正常工作。为什么$watchCollection不会自动使用objectEquality来确定
$scope.$watchCollection()
方法,为了在该数组上运行一些过滤,我需要监视该数组的更改。当用户使用复选框和按钮在给定数组中的一个或多个对象上切换布尔值时,$watch未被正确触发。但是,将objectEquality标志设置为true的$watchCollection
更改为$scope.$watch(arr,function(){},true)
,会使$watch正常工作。为什么$watchCollection
不会自动使用objectEquality来确定是否进行了更改?来自$scope的范围。$watchCollection
:
“浅层”监视对象的属性,并在任何
属性更改(对于数组,这意味着监视数组
项目;对于对象贴图,这意味着查看属性)。如果
如果检测到更改,将触发侦听器回调
因此,对于阵列
而言,它将对阵列
中的项目执行浅层监视,这意味着如果您从阵列
中添加或删除项目,将触发监视功能。如果有对象的数组
,Angular将不会对这些对象执行深度$watch
正如@GregL在下面的评论中指出的那样:$scope.$watchCollection
的意义在于能够在对象
或数组
上进行浅层
$watch
,因为深层的$watch
要昂贵得多,尽管有时需要它
我想在@GregL的评论中补充的唯一一点是,我们经常忘记,
$watch
函数(第一个参数)的watchExpression
也可以是一个函数,它可以用于跟踪大型对象
或数组
的非常具体部分的变化,在很多情况下,我们可以编写该函数,而不是使用deep$watch
,这将使$watch
更高效。据我所知,$watchCollection
的全部要点是它比使用deep$watch
更高效。当你考虑深度表时,最昂贵的路径是当两个对象不同但完全相等时,它必须遍历每一个属性,你就可以看到为什么深层手表如此昂贵,并且在可能的情况下应该避免。但是,如果您需要使用它们,深度观察是检查范围值内是否有任何地方发生了更改的最终方法。@GregL如果您同意,我将在答案中添加您的评论,我还将添加一些内容。@GregL我刚刚更新了我的答案,请查看一下,并让我知道您的想法,非常感谢您的反馈!我同意你的补充意见,这是一个需要记住的好技巧。