Estou tendo dificuldades para entender como funciona a faixa por expressão de ng-repeat no angularjs. A documentação é muito escassa: http://docs.angularjs.org/api/ng/directive/ngRepeat
Você pode explicar qual é a diferença entre esses dois trechos de código em termos de ligação de dados e outros aspectos relevantes?
com: track by $index
<!--names is an array-->
<div ng-repeat="(key, value) in names track by $index">
<input ng-model="value[key]">
</div>
sem (mesma saída)
<!--names is an array-->
<div ng-repeat="(key, value) in names">
<input ng-model="value[key]">
</div>
javascript
angularjs
angularjs-ng-repeat
Jonathan Grupp
fonte
fonte
Respostas:
Você pode,
track by $index
se sua fonte de dados tiver identificadores duplicadospor exemplo:
$scope.dataSource: [{id:1,name:'one'}, {id:1,name:'one too'}, {id:2,name:'two'}]
Você não pode iterar esta coleção enquanto usa 'id' como identificador (id duplicado: 1).
NÃO VAI FUNCIONAR:
mas você pode, se usar
track by $index
:fonte
um breve resumo:
track by
é usado para vincular seus dados à geração de DOM (e principalmente à re-geração) feita por ng-repeat.quando você adiciona,
track by
basicamente diz ao angular para gerar um único elemento DOM por objeto de dados na coleção fornecidaisso pode ser útil ao paginar e filtrar, ou em qualquer caso em que objetos são adicionados ou removidos da
ng-repeat
lista.normalmente, sem
track by
angular irá vincular os objetos DOM com a coleção, injetando uma propriedade expando -$$hashKey
- em seus objetos JavaScript, e irá regenerá-los (e reassociar um objeto DOM) a cada alteração.explicação completa:
http://www.bennadel.com/blog/2556-using-track-by-with-ngrepeat-in-angularjs-1-2.htm
um guia mais prático:
http://www.codelord.net/2014/04/15/improving-ng-repeat-performance-with-track-by/
(track by está disponível em angular> 1.2)
fonte
Se você estiver trabalhando com objetos rastreados pelo identificador (por exemplo, $ index) em vez de todo o objeto e recarregar seus dados mais tarde, o ngRepeat não reconstruirá os elementos DOM para os itens já renderizados , mesmo se os objetos JavaScript na coleção tiverem foi substituído por novos.
fonte