Мне сложно понять, как работает трек по выражению ng-repeat в angularjs. Документация очень скудная: 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>
javascript
angularjs
angularjs-ng-repeat
Джонатан Групп
источник
источник
Ответы:
Вы можете,
track by $index
если ваш источник данных имеет повторяющиеся идентификаторынапример:
$scope.dataSource: [{id:1,name:'one'}, {id:1,name:'one too'}, {id:2,name:'two'}]
Вы не можете перебирать эту коллекцию, используя id в качестве идентификатора (повторяющийся идентификатор: 1).
НЕ РАБОТАЕТ:
но вы можете, если используете
track by $index
:источник
краткое содержание:
track by
используется для связывания ваших данных с генерацией DOM (и в основном повторной генерацией), созданной ng-repeat.когда вы добавляете,
track by
вы в основном указываете angular генерировать один элемент DOM для каждого объекта данных в данной коллекцииэто может быть полезно при разбиении по страницам и фильтрации, или в любом случае, когда объекты добавляются или удаляются из
ng-repeat
списка.Обычно без
track by
angular объекты 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/
(track by доступен в angular> 1.2)
источник
Если вы работаете с объектами, отслеживаемыми по идентификатору (например, $ index), а не по всему объекту, и вы перезагружаете свои данные позже, ngRepeat не будет перестраивать элементы DOM для элементов, которые он уже визуализировал , даже если объекты JavaScript в коллекции имеют были заменены на новые.
источник