Angularjs 物体上的角度表及其';孩子
我的指令中有一个on对象,比如:Angularjs 物体上的角度表及其';孩子,angularjs,Angularjs,我的指令中有一个on对象,比如: scope = { A : { B : [], C : 5 } } scope.$watch('A', function aWasChanged(){}); scope.$watchCollection('B', function bWasChanged(){}); 我在a和B上都有一块表。但是当a换了表,B的表也被叫作a。我想要的是,当A被更改时,只会调用“aWasChanged”(即使B也被更改),而“bWa
scope = {
A : {
B : [],
C : 5
}
}
scope.$watch('A', function aWasChanged(){});
scope.$watchCollection('B', function bWasChanged(){});
我在a和B上都有一块表。但是当a换了表,B的表也被叫作a。我想要的是,当A被更改时,只会调用“aWasChanged”(即使B也被更改),而“bWasChanged”只会在B被更改时被调用。在
A
被更改的情况下,您的意思是什么
通常,$watch()
只检查对象引用的相等性,而不检查结构
例如,如果您将编写以下内容:
$scope.A.ddd = "ddd";
$watch
将捕捉不到这一点
但是,deep 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).
deep watch有点贵,所以正如您所写,这将是一个好方法:
scope.$watchCollection('A.B', function bWasChanged(){});
如果你真的想做这样的事情
$scope.foo.A = {
B: [],
C: 6
};
把手表放在火上,但不要放在B火上,你可以知道它的角度有多大
var key = $scope.foo.A.B.$$hashKey;
$scope.foo.A = {
B: [],
C: 6
};
$scope.foo.A.B.$$hashKey = key;
这是更新后的plnkr。您如何更改?因为A的属性中有B,给A分配一个新值会改变B,所以两个表都会触发。我认为触发“只有B发生了变化”并不容易,因为正如@hassassin所说,B是A的孩子。你可以编写自己的比较函数来获得正确的信息。我制作了一个简单的plunker来处理:使用watch和objectEquality参数将
true
;这也会触发B的更改回调,这是合乎逻辑的,因为B也已更改。但是我不想调用B的回调。你的意思是即使B真的被更改了(newvalue!==oldValue)
,你也不想调用B的回调?如果是这样,为什么?因为要么只有B被改变了,要么整个A被改变了。在第一种情况下,我想做一件事(我们称之为B-事),在第二种情况下,我想做其他事情(我们称之为A-事)。当A改变时,我不需要B的事情发生。