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.