理解ngRepeat'track by'表达式

Jon*_*upp 98 javascript angularjs angularjs-ng-repeat

我很难理解如何通过 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>
Run Code Online (Sandbox Code Playgroud)

没有(相同的输出)

<!--names is an array-->
<div ng-repeat="(key, value) in names">
   <input ng-model="value[key]">                         
</div>
Run Code Online (Sandbox Code Playgroud)

nil*_*lsK 89

你可以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>
Run Code Online (Sandbox Code Playgroud)

但你可以,如果使用track by $index:

<element ng-repeat="item in dataSource track by $index">
  // something with item ...
</element>
Run Code Online (Sandbox Code Playgroud)

  • 这个问题已经过时了,但我仍然认为这可能有助于更好地理解http://www.bennadel.com/blog/2556-using-track-by-with-ngrepeat-in-angularjs-1-2.htm短版本这里的解释https://docs.angularjs.org/error/ngRepeat/dupes (4认同)
  • 感谢您的回答!但肯定重复标识符不是唯一的用例。我也想知道“幕后”发生了什么。 (3认同)
  • 还需要考虑的另一件事是,如果你可以按键使用跟踪,你将获得更好的性能(blog.500tech.com/is-reactjs-fast).此功能允许您使用唯一标识符将JavaScript对象与ngRepeat DOM(文档对象模型)节点相关联.有了这种关联,AngularJS就不会破坏并不必要地重新创建DOM节点.这可以带来巨大的性能和用户体验优势(http://www.bennadel.com/blog/2556-using-track-by-with-ngrepeat-in-angularjs-1-2.htm). (3认同)
  • 嗯,这很简单:只需查看[code](https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js#L3),它就是全部开源的;) (2认同)

Nur*_*iel 57

简短摘要:

track by 用于将您的数据与ng-repeat生成的DOM生成(主要是重新生成)相关联.

当你添加时,track by你基本上告诉angular在给定集合中为每个数据对象生成一个DOM元素

这在分页和过滤时,或者在ng-repeat列表中添加或删除对象的任何情况下都很有用.

通常,没有track byangular会将DOM对象与集合链接起来,方法是将一个expando属性 - 注入$$hashKey到JavaScript对象中,并将其重新生成(并重新关联一个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提供)


ram*_*993 7

如果您正在使用标识符跟踪对象(例如$ index)而不是整个对象,并且稍后重新加载数据,则ngRepeat 将不会已呈现的重建DOM元素,即使集合中的JavaScript对象具有取代了新的.

  • 要么不使用 track by 要么更改更改对象上的唯一标识符。请注意,您不能更改 $index,建议不要使用 $index 而是使用对象唯一的标识符(例如 id) (2认同)