Javascript 理解ngRepeat';通过'跟踪;表达

Javascript 理解ngRepeat';通过'跟踪;表达,javascript,angularjs,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Ng Repeat,我很难理解angularjs中ng repeat的track by表达式是如何工作的。文件非常稀少: 你能解释一下这两段代码在数据绑定和其他相关方面的区别吗 使用:track by$index 无(相同输出) 如果数据源具有重复的标识符,则可以按$index跟踪 e、 g.:$scope.dataSource:[{id:1,名称:'one'},{id:1,名称:'one-too'},{id:2,名称:'two'}] 使用“id”作为标识符(重复id:1)时,无法迭代此集合 不起作用: <

我很难理解angularjs中ng repeat的track by表达式是如何工作的。文件非常稀少:

你能解释一下这两段代码在数据绑定和其他相关方面的区别吗

使用:
track by$index


无(相同输出)


如果数据源具有重复的标识符,则可以
按$index跟踪

e、 g.:
$scope.dataSource:[{id:1,名称:'one'},{id:1,名称:'one-too'},{id:2,名称:'two'}]

使用“id”作为标识符(重复id:1)时,无法迭代此集合

不起作用:

<element ng-repeat="item.id as item.name for item in dataSource">
  // something with item ...
</element>
简短总结:

track by
用于将数据与ng repeat生成的DOM(主要是重新生成)链接起来

添加
trackby
时,基本上是告诉angular为给定集合中的每个数据对象生成一个DOM元素

在分页和筛选时,或者在从
ng repeat
列表添加或删除对象的任何情况下,这都非常有用

通常,如果没有
track by
angular,angular将通过向JavaScript对象中注入expando属性-
$$hashKey
,将DOM对象与集合链接,并在每次更改时重新生成它(并重新关联DOM对象)

详细说明:

更实用的指南:


(track by在angular>1.2中可用)

如果使用对象按标识符(例如$index)而不是整个对象进行跟踪,并且稍后重新加载数据,ngRepeat将不会为其已渲染的项目重建DOM元素,即使集合中的JavaScript对象已替换为新对象。

感谢您的回答!但是,重复标识符肯定不是唯一的用例。我还想知道“幕后”发生了什么。好吧,这很简单:只要看看,它都是开源的;)这个问题由来已久,但我仍然认为这可能有助于更好地理解这里的简短解释。需要考虑的另一件事是,如果您可以使用按键跟踪,您将获得更好的性能(blog.500tech.com/is-reactjs-fast)。此功能允许您使用唯一标识符将JavaScript对象与ngRepeat DOM(文档对象模型)节点关联。有了这个关联,AngularJS就不会不必要地破坏和重新创建DOM节点。这会给性能和用户体验带来巨大的好处()。我有一个700多个项目的列表。渲染时间从4秒变为100毫秒。基于来自rest的数据,所有ngRepeat都应使用Track by。有任何参考资料可以证明这一点吗?有没有办法强制重新渲染?或者其他的工作?我在任何地方都没有发现这一点,但我相信这是给我造成混乱的原因,我已经浪费了很多时间。要么不要使用track by,要么更改更改对象上的唯一标识符。请注意,您不能更改$index,建议不要使用$index,而是使用对象的唯一标识符(例如id)。这是一个很好的问题,答案非常好!很遗憾,OP没有接受答案——或者你认为这个问题回答得不对吗?你是对的!我刚刚接受了TJ的回答。
<element ng-repeat="item in dataSource track by $index">
  // something with item ...
</element>