Compreender a expressão ngRepeat 'track by'

estou a ter dificuldade em compreender como funciona o track by expression of ng-repeat in angularjs. A documentação é muito escassa: http://docs.angularjs.org/api/ng/directive/ngRepeat

pode explicar qual é a diferença entre estes dois trechos de código em termos de databinding 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 (mesmo resultado)

<!--names is an array-->
<div ng-repeat="(key, value) in names">
   <input ng-model="value[key]">                         
</div>
Author: isherwood, 2014-03-31

3 answers

Pode track by $index se a sua fonte de dados tiver identificadores duplicados

E. g.: $scope.dataSource: [{id:1,name:'one'}, {id:1,name:'one too'}, {id:2,name:'two'}]

Não pode iterar esta colecção ao usar o 'id' como identificador (ID duplicado:1).

NÃO VAI FUNCIONAR.:

<element ng-repeat="item.id as item.name for item in dataSource">
  // something with item ...
</element>

Mas pode, se utilizar track by $index:

<element ng-repeat="item in dataSource track by $index">
  // something with item ...
</element>
 98
Author: nilsK, 2016-01-31 06:29:14

um breve resumo:

track by é usado para ligar os seus dados com a geração DOM (e principalmente re-geração) feita pela ng-repeat.

Quando adiciona {[[0]}, basicamente diz ao angular para gerar um único elemento DOM por objecto de dados na colecção indicada {[[9]}

Isto pode ser útil quando a chamada de pessoas e a filtragem, ou em qualquer caso em que os objectos sejam adicionados ou removidos da lista ng-repeat.

Normalmente, sem {[[0]} o angular ligará os objectos DOM com o colecção injectando uma propriedade expando - $$hashKey - nos seus objectos JavaScript, e irá regenerá-la (e associar de novo um objecto 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 )

 60
Author: Nuriel, 2014-10-13 14:10:17

Se você estiver trabalhando com objetos acompanhar pelo identificador(por exemplo, $índice) em vez de o objeto inteiro e você recarregar os seus dados mais tarde, ngRepeat não irá reconstruir os elementos do DOM para itens tem já prestados, mesmo se o JavaScript objetos na coleção têm sido substituídos por novos.

 8
Author: ram1993, 2016-09-13 06:37:29