Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 物体上的角度表及其';孩子_Angularjs - Fatal编程技术网

Angularjs 物体上的角度表及其';孩子

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

我的指令中有一个on对象,比如:

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的事情发生。