Angular $watch on an array of objects
让我说我有一系列动物对象绑定到我的范围。每个对象都有一个"名称"属性和一个"声音"属性。
然后我$ watch数组并将objectEquality标志设置为true(第三个参数)。
在我看来,我使用动物数组的ng-repeat为每个动物创建一个按钮。然后,我将点击处理函数传递给相应的动物对象。
在单击处理程序中,如果我要更新其中一只动物的名称,则$ w??atch可以获取更改,并且可以在侦听器函数中进行处理。
现在我遇到的问题是,如果我要用一个新对象重新分配一个动物对象,而不仅仅是更改其属性,则$ w??atch不会接受此更改。对象数组已明显更改,但未调用我的侦听器。
下面的plunkr是我刚刚概述的示例:
http://plnkr.co/edit/PHXq32?p=预览
尝试将$ index作为参数传递给您的函数,然后执行
1 | $scope.animals[index] = {name:'Billy', sound:'baaaa'}; |
应该做的
这与AngularJS无关
第一件事-永远记住JavaScript是通过价值传递的
这是什么意思?让我们来考虑两种情况,图元,数组和对象
原语-您只需将值传递给函数即可。因此,如果将在函数外部初始化的变量作为函数参数传递给函数内部,则对函数内部的值所做的更改不会更改外部的值。
prm = prm+1;
}
testPrimitive(prm);
console.log(prm) //prm will be
对象和数组-这里传递的值是对象的引用。因此,问题在于,如果新创建了整个对象,传递给函数的对象的更改属性是如何反映出来的,而更改却不能反映出来。让我们举个例子。
//so here two objects are created lets say at some referrence in memory ref1 and ref2 and the //memory location is assigned to foo and bar
o1.name='changed';
//the object o1 is not newly created. its only takes the reference and updates the property.
o2 = {id:3, name:'iamnew'};
// A new object is created in a reference say 'ref3' and the ref3 is assigned to o2. Note here ref1 still remains the same
}
console.log(bar);
//bar will be {id:2, name:'iambar'} since bar still has ref1 memory location value
在您的情况下,您要在数组内传递一个创建新对象并分配引用。一旦您不在函数循环中,则引用将丢失,并且无法在任何地方使用;
在函数内部
尝试
关于此的一篇不错的文章:http://snook.ca/archives/javascript/javascript_pass
尽管我觉得这些看起来像是基本的东西,但大多数人对此并不了解或非常困惑。