我正在构建邮件系统的前端。它很好地分为控制器和服务。我使用 $interval 来检查新邮件,这些邮件以 JSON 形式接收并添加到模型中。
一切都很好地呈现在屏幕上,带有用于选择删除邮件的复选框和按钮等......
问题是,当一个人做出选择时 - $interval 将检查新邮件,并用传入数据替换模型数组,重新创建 DOM 并重置所有选择,无论它是否包含新数据或相同数据。前端的整个想法是避免用户一直点击“更新”。
我认为 angular.copy 可以让我免于头痛,但是没有......我阅读了各种关于在模型中包含日期以区分传入模型和现有模型的奇怪内容。
对于这个问题,我只能想出一种解决方案,那就是自己编写函数,将传入数组和现有数组与两个对象上的所有现有属性进行比较。外汇。 obj1.id == obj2.id 然后检查属性,如果对象不存在则添加对象。
我在淘汰赛中被宠坏了,因为它涉及这类事情。 (当将相同的 JSON 数组发送到可观察对象时,它不会重新创建 dom - 单独留下我的复选框/dom 更改)。
有谁对这个问题有一个好的解决方案,或者有人可以推荐某种黑客吗?我对一切都持开放态度!我已经绝望了。
我找到了解决办法!
在浏览并进一步检查我的场景中的“track by”之后,我可以看到它实际上做了更多的事情:
1) 如果您有一个对象集合,每个对象都具有:id、名称、描述,您可以使用“跟踪依据”选择它连接到的属性,因此,在从 Web 服务检索新的对象集合时,它不会渲染属于该值的 DOM 对象。
2)最重要的是,也是我所追求的:如果具有现有 id 的对象从服务器到达且名称已更改,那么它是否会反映在具有该 id 的对象的数组集合中?是的,它会的!因此,“track by”实际上会检查传入对象的属性并替换旧对象,但仍保留 id。太激烈了。
还值得注意的是,“track by”也适用于除NG-重复, 例如select.
我为其他可能对一切如何运作感到困惑的人做了一个小演示......但这似乎很酷!
<div ng-repeat='country in countryArray track by country.id'>
{{country.id}}
{{country.name}}
<input type="checkbox"></input>
</div>
<div>
<select ng-model='nonExisting'
ng-options='country.name for country in countryArray
track by country.id'></select>
</div>
</div>
http://jsfiddle.net/KUf8C/ http://jsfiddle.net/KUf8C/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)