繁体   English   中英

数组对象上的角度$ watch

[英]Angular $watch on an array of objects

可以说我有一些动物对象绑定到我的作用域。 每个对象都有一个“名称”属性和一个“声音”属性。

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

在我看来,我使用ng-repeats动物数组为每个动物创建一个按钮。 然后,我将点击处理函数传递给相应的动物对象。

在单击处理程序中,如果我要更新其中一只动物的名称,则$ w​​atch可以获取更改,并且可以在侦听器函数中进行处理。

现在我遇到的问题是,如果我要用一个新对象重新分配一个动物对象,而不仅仅是更改其属性,则$ w​​atch不会接受此更改。 对象数组已明显更改,但未调用我的侦听器。

以下plunkr是我刚刚概述的示例:

http://plnkr.co/edit/PHXq32?p=预览

这与AngularJS无关。第一件事-永远记住JavaScript是通过值传递的,这意味着什么? 让我们看一下两种情况:基元,数组和对象

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

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

    var prm = 1; testPrimitive(prm); console.log(prm) //prm will be 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

在您的情况下,您要在数组内传递一个创建新对象并分配引用。 一旦您退出函数循环,引用将丢失,并且无法在任何地方使用。 尝试animal.name ='Billy'; animal.sound='baaaa'; animal.name ='Billy'; animal.sound='baaaa'; 而是在您的函数内

一篇不错的文章: http : //snook.ca/archives/javascript/javascript_pass

尽管我觉得这些看起来像是基本的东西,但大多数人对此并不了解或非常困惑。

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

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

那应该做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM