假设我有一系列动物对象绑定到我的范围。每个对象都有一个'名称'财产和声音'属性。
然后我观察数组并将objectEquality标志设置为true(第三个参数)。
在我看来,我使用动物阵列的ng-repeat为每个动物创建了一个按钮。然后我将点击处理功能传递给相应的动物对象。
在点击处理程序中,如果我要更新其中一只动物的名字,$ watch会获取更改,我可以在侦听器功能中处理它。
现在我遇到的问题是,如果我要用一个新对象重新分配其中一个动物对象,而不仅仅是改变它的属性,$ watch不会接受这个改变。对象数组已经明显改变,但我的监听器没有被调用。
以下的插件是我刚才概述的例子:
答案 0 :(得分:0)
这与AngularJS无关 第一件事 - 永远记住JavaScript 按值传递 这是什么意思?让我们采用两种情况原语,数组和对象
基元 - 您只需将值传递给该函数即可。因此,如果将函数外部初始化的变量作为函数参数传递,则对函数内部的值进行的更改不会更改外部的值。
function testPrimitive(prm){
prm = prm+1;
}
var prm = 1;
testPrimitive(prm);
console.log(prm) //prm will be
仍然是1
对象和数组 - 此处传递的值是对象的引用。因此,问题在于如何反映传递给函数的对象的更改属性,并且如果整个对象是新创建的,则更改不会反映。让我们举一个例子。
var foo = {id:1, name:'iamfoo'}, bar = {id:2, name:'iambar'};
//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
function updateObj(o1, o2){
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
}
updateObj(foo, bar);
// ref1和ref2内存位置值在这里传递
console.log(foo);//foo will be {id:1, name:'changed'}
console.log(bar);
//bar will be {id:2, name:'iambar'} since bar still has ref1 memory location value
在你的情况下,你传递一个在数组中创建一个新对象并分配引用。一旦你在函数循环之外,参考就会丢失,不能在任何地方使用; 在您的功能
中尝试animal.name ='Billy'; animal.sound='baaaa';
关于此的好文章:http://snook.ca/archives/javascript/javascript_pass
虽然我觉得这些看起来像基本的东西,但大多数人都不知道或者对此很困惑。
答案 1 :(得分:0)
尝试将$ index作为参数传递给您的函数,然后执行
$scope.animals[index] = {name:'Billy', sound:'baaaa'};
应该这样做