对象的角度观察和它的孩子

时间:2014-02-06 07:46:02

标签: angularjs

我的指令中有一个on对象,让我们说:

scope = {
    A : { 
       B : [],
       C : 5
    }
}

scope.$watch('A', function aWasChanged(){});
scope.$watchCollection('B', function bWasChanged(){});

我在A和B上有一块手表。但是当A被改变时,B的手表也会被调用。我想要的是当A被改变时,只会调用“aWasChanged”(即使B也被改变),只有当B被改变时才会调用“bWasChanged”。

2 个答案:

答案 0 :(得分:1)

A下你的意思是什么?

通常$watch()仅检查对象引用相等但不检查结构。

例如,如果您要编写类似的内容:

$scope.A.ddd = "ddd";

$watch将无法捕捉到这一点。

然而深度监视(带有标记true)应该注意这种情况。

  

当A被更改时,只会调用“aWasChanged”......

我想你的意思是C会改变...所以写你的自定义比较器如:

$scope.$watch(function () {
       return $scope.A;
    },
    function (newValue, oldValue) {

     if(newValue.C == oldValue.C){return;} // avoid B

     /*...*/

    }, true); // Object equality (not just reference).

深度观看有点贵,所以就像你写的那样会很好:

scope.$watchCollection('A.B', function bWasChanged(){});

答案 1 :(得分:0)

如果你真的想做类似

的事情
$scope.foo.A = {
  B: [],
  C: 6
};

将手表放在A火上而不是放在B火上,你可以随时破解棱角分度的方式。

var key = $scope.foo.A.B.$$hashKey;
$scope.foo.A = {
  B: [],
  C: 6
};
$scope.foo.A.B.$$hashKey = key;

这是一个更新的plnkr,其中包含http://plnkr.co/edit/hAY9pb3AUAF0drAm42A5?p=preview