Comment obtenir des valeurs normalisées pour un tableau lorsque vous utilisez ng-repeat

J'essaie d'obtenir la valeur normalisée d'un tableau associé à différents groupes.

Http://jsfiddle.net/k5Dvj/5/

Je ne souhaite pas ajouter quelque chose de nouveau dans les éléments du tableau d'origine, donc je renvoie de nouveaux objets pour des éléments normalisés pour chaque groupe.

$scope.nomalizedItems = function (groupid) { var groupItems = $scope.originalItems.filter(function (item) { return item.groupid == groupid }); var values = groupItems.map(function (item) { return item.value; }); var maxValue = Math.max.apply(null, values); return groupItems.map(function (item) { return { id: item.id, normalizedValue: item.value / maxValue }; }); }; 

Je crois que cette logique est vraiment simple, mais angularjs est toujours en train de blâmer " [$rootScope:infdig] 10 $digest() iterations reached. Aborting! " Même si j'ai ajouté la " track by item.id " dans l'expression ng-repeat .

Une idée de la façon de résoudre ce problème? Merci!

ngRepeat directive ngRepeat n'est pas satisfaite. Votre code crée de nouveaux objets à chaque fois. La digestion boucle encore et encore …

D'après ce que je sais, la track by expression n'est pas censée faire correspondre les entités précédentes avec les nouvelles correspondantes après avoir effacé toutes leurs propriétés internes de $$hashKey en recréant les entités. Cette instruction est conçue pour indiquer à la directive ngRepeat comment construire cette $$hashKey interne pour éviter les déchets de création d'éléments DOM.

Alors … Vous ne pouvez modifier vos objets que de créer de nouveaux éléments:

  groupItems.forEach(function (item) { item.normalizedValue = item.value / maxValue; }); return groupItems; 

Et cela fonctionne.

En outre, votre filtrage se produit à chaque boucle de synthèse. À des fins de performance, vous pouvez préférer cuire ce tableau dans des rappels d'événements spécifiques / des observateurs.

METTRE À JOUR

En fait, la digestion ne ngRepeat pas encore et encore si vous faites cuire cette liste en dehors de l'expression ngRepeat ! Je vous suggère d'avoir un contrôleur par group utilisant les ngRepeat enfant créées par la directive ngRepeat et de cuire cette liste dans un rappel de watcher.