我的指令中有一个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”。
答案 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。