0

html:

<table> 
    <tbody> 
    <tr ng-repeat="row in Rows track by $index" ng-init="initUserDecision(row,$index)" > 
     <td>{{employeeName}}</td> 
    </tr> 
</table> 
<button id="change"/> 
contrôleur

:

$scope.initUserDecision = function(row,index){ 
    $scope.employeeName=row["name"]; 
} 
$scope.rows=[{id:1,name:'siva'},{id:2,name:'ram'}] 
//changing $scope.rows in button click event and used $scope.$apply as well 
angular.element(document).on("click", "#change", function() { 
    $scope.rows=[{id:1,name:'ravi'},{id:2,name:'raj'}] 
    $scope.$apply(); 
}); 

fonction ng-init appeler pour la première fois lors de tr initialisé. si je clique sur la touche, la collection de lignes de boutons est modifiée et elle n'appelle plus ng-init. si j'enlève la trace par $indexng-init en appelant les deux fois. quand j'utilise la piste par $index il a été appelé seulement une fois. pourquoi est-ce vrai? Une idée à ce sujet.

Répondre

1

Lorsque vous utilisez track by $index. La surveillance est maintenue sur data item dans collection par leur index et non par uid.

  1. not track by,

    Dans ce cas, créer ngRepeatnew uid pour data item dans la collecte chaque fois collection is updated. ngRepeat voit new uids et re-renders tous les éléments.

  2. track by,($index)

    Dans ce cas, ngRepeat utilise index as uid pour le point de données dans la collecte. ngRepeat ne voit pas new uids et par conséquent no re-rendering des éléments (ajouter ou supprimer, le cas échéant, mais no rendering of others). (Comme watch est conservé sur des données, il se updated mais pas de rendu)

+0

OP de créer de nouveaux objets sur le bouton cliquez sur '$ scope.rows = [{id: 1, nom: 'Ravi'}, { id: 2, nom: 'raj'}] '. Où est indexé? –

+0

Le composant trackByIdFn de ngRepeat utilise l'index de l'élément dans la collection et cet index est donné à la portée de transclusion. – ram1993

+0

oui, vous avez raison –