Angular $ watch对象数组

时间:2014-06-05 17:16:12

标签: javascript arrays angularjs object

假设我有一系列动物对象绑定到我的范围。每个对象都有一个'名称'财产和声音'属性。

然后我观察数组并将objectEquality标志设置为true(第三个参数)。

在我看来,我使用动物阵列的ng-repeat为每个动物创建了一个按钮。然后我将点击处理功能传递给相应的动物对象。

在点击处理程序中,如果我要更新其中一只动物的名字,$ watch会获取更改,我可以在侦听器功能中处理它。

现在我遇到的问题是,如果我要用一个新对象重新分配其中一个动物对象,而不仅仅是改变它的属性,$ watch不会接受这个改变。对象数组已经明显改变,但我的监听器没有被调用。

以下的插件是我刚才概述的例子:

http://plnkr.co/edit/PHXq32?p=preview

2 个答案:

答案 0 :(得分:0)

这与AngularJS无关 第一件事 - 永远记住JavaScript 按值传递 这是什么意思?让我们采用两种情况原语,数组和对象

  1. 基元 - 您只需将值传递给该函数即可。因此,如果将函数外部初始化的变量作为函数参数传递,则对函数内部的值进行的更改不会更改外部的值。

    function testPrimitive(prm){ prm = prm+1; }

    var prm = 1; testPrimitive(prm); console.log(prm) //prm will be仍然是1

  2. 对象和数组 - 此处传递的值是对象的引用。因此,问题在于如何反映传递给函数的对象的更改属性,并且如果整个对象是新创建的,则更改不会反映。让我们举一个例子。

    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

  3. 在你的情况下,你传递一个在数组中创建一个新对象并分配引用。一旦你在函数循环之外,参考就会丢失,不能在任何地方使用; 在您的功能

    中尝试animal.name ='Billy'; animal.sound='baaaa';

    关于此的好文章:http://snook.ca/archives/javascript/javascript_pass

    虽然我觉得这些看起来像基本的东西,但大多数人都不知道或者对此很困惑。

答案 1 :(得分:0)

尝试将$ index作为参数传递给您的函数,然后执行

$scope.animals[index] = {name:'Billy', sound:'baaaa'};

应该这样做