Javascript AngularJS-持续关注收藏

Javascript AngularJS-持续关注收藏,javascript,angularjs,watch,Javascript,Angularjs,Watch,我正在尝试在我的应用程序中为一个集合构建一个真正的观察者,起初,我认为Angular可以提供我所需要的一切 我的意思是,我有$watch,既浅又深。和$watchCollection,一个$digest循环,通过脏检查机制在我的$scope exposed变量上循环,并触发所有的观察者 太好了!我还需要什么 错了 结果表明,$watchCollection仅在被监视变量的第一次更改时被触发… 这就是强大的观察者们的故事。。。为什么 经过一段时间后,我意识到我需要某种可怕的循环来检查这个集合,否则

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

我的意思是,我有
$watch
,既浅又深。和
$watchCollection
,一个
$digest
循环,通过
脏检查
机制在我的
$scope exposed
变量上循环,并触发所有的观察者

太好了!我还需要什么

错了

结果表明,
$watchCollection
仅在被监视变量的第一次更改时被触发…
这就是强大的观察者们的故事。。。为什么

经过一段时间后,我意识到我需要某种可怕的循环来检查这个集合,否则每当var被修改时,我必须实现某种回调来完成这项工作

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


重要提示:
我不知道为什么,但我的代码中似乎有一些可怕的bug在啃我的脚踝

既然我已经修复了它,那么
$watchCollection(expr,foo)
$watch(expr,foo,true)
都能正常工作

我被SO帖子误导了,其中一位用户评论:

[…]我在您的代码中没有看到任何发出后续请求(检查新消息)的内容。在哪里发生的

我把他的评论作为我假设的证据。。。我的错


我把这个问题留作纪念

如果使用第三个参数(
objectEquality
),我很肯定一个普通的
$watch
会做到这一点。这将检查对象是否相等,而不仅仅是引用

因此,您可以使用以下内容:

$scope.$watch('prop', function(value) {
   // do something
   }, true);  
true
值告诉Angular比较对象而不是参照


下面的is with
scope

解决方案有点像黑客解决方案,只有在$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。

将true作为第三个参数传递给watch应该可以。。。。作用域。$watch('data',函数(newVal){/*…*/},true);黑客,但可能有它的用途。请看一下我的最新作品。这就是深度监视应该做的事情。请看一下我的更新