AngularJS - 持续监视集合

时间:2014-03-04 09:59:35

标签: javascript angularjs watch

我正在尝试在我的应用程序中为一个集合构建一个真正的观察者,起初,我认为 Angular 会为我提供我需要的一切。

我的意思是,我有$watch,既浅又深。以及$watchCollection$digest周期通过$scope-exposed机制循环遍历dirty checking个变量并触发所有观察者......

大!我还需要什么?

错误!

事实证明$watchCollection仅在观察变量的第一次更改时被触发...
这就是强大的观察者......为什么???

reality check之后,我意识到我需要某种可怕的循环来检查这个集合,否则每当var被修改时我都必须实现某种回调来执行此操作。

有人知道如何以最干净的方式做到这一点吗?

<小时/> 重要提示:
我不知道为什么,但似乎我的代码中的一些可怕的错误是啃我的脚踝......

现在我已修复它,$watchCollection(expr, foo)$watch(expr, foo, true)都按预期工作...

我在this SO帖子中误导了用户评论:

  

[...]我的代码中没有看到任何后续请求(检查新消息)。那会发生什么?

我把他的评论作为我假设的证据......我的坏!

我将这个问题留作 memento

2 个答案:

答案 0 :(得分:1)

如果您使用第3个参数($watch),我非常确定常规objectEquality会执行此操作。这将检查对象是否相等而不仅仅是引用。

所以,你可以使用这样的东西:

$scope.$watch('prop', function(value) {
   // do something
   }, true);  

true值告诉Angular比较对象而不是引用。

documentation for this featurescope合作。

答案 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。