我正在尝试在我的应用程序中为一个集合构建一个真正的观察者,起初,我认为 Angular 会为我提供我需要的一切。
我的意思是,我有$watch
,既浅又深。以及$watchCollection
,$digest
周期通过$scope-exposed
机制循环遍历dirty checking
个变量并触发所有观察者......
大!我还需要什么?
错误!
事实证明$watchCollection
仅在观察变量的第一次更改时被触发...
这就是强大的观察者......为什么???
在reality check之后,我意识到我需要某种可怕的循环来检查这个集合,否则每当var被修改时我都必须实现某种回调来执行此操作。
有人知道如何以最干净的方式做到这一点吗?
<小时/> 重要提示:
现在我已修复它,$watchCollection(expr, foo)
和$watch(expr, foo, true)
都按预期工作...
我在this SO帖子中误导了用户评论:
[...]我的代码中没有看到任何后续请求(检查新消息)。那会发生什么?
我把他的评论作为我假设的证据......我的坏!
我将这个问题留作 memento
答案 0 :(得分:1)
如果您使用第3个参数($watch
),我非常确定常规objectEquality
会执行此操作。这将检查对象是否相等而不仅仅是引用。
所以,你可以使用这样的东西:
$scope.$watch('prop', function(value) {
// do something
}, true);
true
值告诉Angular比较对象而不是引用。
documentation for this feature与scope
合作。
答案 1 :(得分:1)
下面的解决方案是一个黑客解决方案,只有在$ watchCollection不起作用时才应该使用。而不是在阵列上观看,请注意json
$scope.$watch(function() {
return angular.toJson($scope.array);
},
function() {
// watch logic
}
我正在使用上面的解决方案来监视下面的多个数组:
$scope.$watch(function() {
return JSON.stringify([$scope.array1, $scope.array2]);
},
function() {
// watch logic
}
您可以使用JSON.stringify或angular.toJson。