La compréhension de la ngRepeat 'suivi par' expression
Je vais avoir du mal à comprendre comment le piste par expression de ng-repeat dans angularjs œuvres. La documentation est très rare: http://docs.angularjs.org/api/ng/directive/ngRepeat
Pouvez-vous expliquer quelle est la différence entre ces deux bouts de code est en termes de databinding et d'autres aspects pertinents?
avec: track by $index
<!--names is an array-->
<div ng-repeat="(key, value) in names track by $index">
<input ng-model="value[key]">
</div>
sans (même résultat)
<!--names is an array-->
<div ng-repeat="(key, value) in names">
<input ng-model="value[key]">
</div>
- Une grande question, avec de très bonnes réponses! C'est dommage que l'OP n'a pas accepter une réponse, ou ne pensez-vous pas que la question a été répondue correctement?
- Vous avez raison! J'ai juste accepté de T J réponse.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez
track by $index
si votre source de données en double dans les identificateurspar exemple:
$scope.dataSource: [{id:1,name:'one'}, {id:1,name:'one too'}, {id:2,name:'two'}]
Vous ne pouvez pas parcourir cette collection tout en utilisant 'id' identifiant (id double:1).
NE FONCTIONNE PAS:
mais vous pouvez, si vous utilisez
track by $index
:$index
sans l'utilisation de la piste par. Comment?track by $index
juste forces ngRepeat utiliser $index comme identifiant.<element ng-repeat="item.id as item.name for item in dataSource">
- Ce n'est pas le travail, même si les valeurs de "source de données" ne sont pas de dup juste renvoie une erreur de syntaxe..un court résumé:
track by
est utilisé afin de relier vos données avec le DOM génération (et surtout de ré-génération) faite par ng-repeat.lorsque vous ajoutez
track by
en gros, vous dites angulaire de générer un seul élément du DOM par les données de l'objet dans la collection donnéece qui peut être utile lors de la pagination et de filtrage, ou de tout cas où les objets sont ajoutés ou supprimés à partir de
ng-repeat
liste.généralement, sans
track by
angulaire fera le lien entre les objets DOM avec la collection par injection d'une propriété expando -$$hashKey
dans vos objets en JavaScript, et de la régénérer (et re-associer un objet DOM) à chaque changement.explication complète:
http://www.bennadel.com/blog/2556-using-track-by-with-ngrepeat-in-angularjs-1-2.htm
un plus guide pratique:
http://www.codelord.net/2014/04/15/improving-ng-repeat-performance-with-track-by/
(piste est disponible dans angulaire > 1.2 )
Si vous travaillez avec des objets suivi de l'identifiant de(par exemple, $index) au lieu de l'ensemble de l'objet et de vous recharger vos données plus tard, ngRepeat va pas reconstruire les éléments DOM pour les items, il a déjà rendu, même si le JavaScript les objets de la collection ont été remplacées par de nouvelles.