理解 ngRepeat 'track by' 表达式
Understanding the ngRepeat 'track by' expression
我很难理解 angularjs 中 ng-repeat 表达式的轨道是如何工作的。文档非常稀缺:http://docs.angularjs.org/api/ng/directive/ngRepeat
您能解释一下这两个代码片段在数据绑定和其他相关方面之间的区别吗?
与: track by $index
<!--names is an array-->
<div ng-repeat="(key, value) in names track by $index">
<input ng-model="value[key]">
</div>
无(相同的输出)
<!--names is an array-->
<div ng-repeat="(key, value) in names">
<input ng-model="value[key]">
</div>
您可以track by $index
数据源是否具有重复的标识符
例如:$scope.dataSource: [{id:1,name:'one'}, {id:1,name:'one too'}, {id:2,name:'two'}]
使用"id"作为标识符(重复 id:1)时,无法迭代此集合。
不起作用:
<element ng-repeat="item.id as item.name for item in dataSource">
// something with item ...
</element>
但是你可以,如果使用track by $index
:
<element ng-repeat="item in dataSource track by $index">
// something with item ...
</element>
简短的总结:
track by
用于将您的数据与ng-repeat进行的DOM生成(主要是重新生成)链接起来。
当你添加track by
你基本上告诉 angular 在给定集合中为每个数据对象生成一个 DOM 元素
这在分页和筛选时,或者在列表中添加或删除对象的任何情况下ng-repeat
可能很有用。
通常,如果没有track by
Angular 将通过在 JavaScript 对象中注入 expando 属性 - $$hashKey
- 将 DOM 对象与集合链接起来,并将每次更改重新生成它(并重新关联 DOM 对象)。
完整解释:
http://www.bennadel.com/blog/2556-using-track-by-with-ngrepeat-in-angularjs-1-2.htm
更实用的指南:
http://www.codelord.net/2014/04/15/improving-ng-repeat-performance-with-track-by/
(在角度> 1.2 中提供跟踪方式)
如果您正在使用按标识符(例如 $index)而不是整个对象跟踪的对象,并且稍后重新加载数据,ngRepeat 将不会为已经呈现的项目重建 DOM 元素,即使集合中的 JavaScript 对象已被替换为新对象。
- java.net和javascript之间正则表达式的差异
- Grunt匹配正则表达式
- 不同浏览器中的空白字符正则表达式行为
- ng init中的表达式无法使用ng repeat
- 正则表达式在字符串中找到base64
- 我的AngularJS表达式没有'不起作用
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 调用正则表达式匹配的函数
- 表达式引擎扩展开发-向呈现的条目添加自定义javascript
- 使用正则表达式评估电子邮件地址时出现性能问题
- Javascript 正则表达式 : ^[^/s/]+[a-z]{1,}[0-9]*[-_]*[^/][
- JavaScript正则表达式文本与RegExp对象
- 正则表达式只允许 x 个整数
- 使用正则表达式将输入格式设置为单字符逗号、单字符逗号等
- 改进用于验证付款金额的正则表达式
- 正则表达式与数字中的第二个点匹配
- 键按正则表达式以查找具有负值的小数
- 一个正则表达式,用于从JS中的HTML标记中删除id、样式和类属性
- "锻造;React中的表达式
- 理解 ngRepeat 'track by' 表达式