Réponse courte : avez-vous vraiment besoin d'une telle fonction ou pouvez-vous utiliser une propriété ? http://jsfiddle.net/awnqm/1/
Réponse longue
Pour simplifier, je ne décrirai que votre cas - ngRepeat pour un tableau d'objets. Aussi, j'omettrai certains détails.
AngularJS utilise vérification de la saleté pour détecter les changements. Lorsque l'application est lancée, elle exécute $digest
pour $rootScope
. $digest
fera une traversée en profondeur pour hiérarchie du champ d'application . Tous les scopes ont une liste de montres. Chaque montre a une dernière valeur (initialement initWatchVal
). Pour chaque portée, pour toutes les montres $digest
l'exécute, obtient la valeur actuelle ( watch.get(scope)
) et le compare à watch.last
. Si la valeur actuelle n'est pas égale à watch.last
(toujours pour la première comparaison) $digest
fixe dirty
à true
. Lorsque tous les scopes sont traités si dirty == true
$digest
commence une autre traversée en profondeur à partir de $rootScope
. $digest
se termine lorsque dirty == false ou le nombre de traversées == 10. Dans ce dernier cas, l'erreur "10 itérations $digest() atteintes." sera enregistrée.
Maintenant à propos ngRepeat
. Pour chaque watch.get
l'appel stocke les objets de la collection (en retournant la valeur de l'option getEntities
) avec des informations supplémentaires dans le cache ( HashQueueMap
par hashKey
). Pour chaque watch.get
appelez ngRepeat
essaie d'obtenir l'objet par son hashKey
de la cachette. S'il n'existe pas dans le cache, ngRepeat
le stocke dans le cache, crée une nouvelle portée, y place un objet, crée un élément DOM, etc. .
Maintenant à propos hashKey
. Habituellement hashKey
est un numéro unique généré par nextUid()
. Mais cela peut être fonction . hashKey
est stocké dans l'objet après sa génération pour une utilisation future.
Pourquoi votre exemple génère une erreur : fonction getEntities()
retourne toujours un tableau avec un nouvel objet. Cet objet n'a pas hashKey
et n'existe pas dans ngRepeat
cache. Ainsi, ngRepeat
sur chaque watch.get
génère une nouvelle portée pour elle avec une nouvelle veille pour {{entity.id}}
. Cette montre au premier watch.get
a watch.last == initWatchVal
. Donc watch.get() != watch.last
. Donc $digest
commence une nouvelle traversée. Donc ngRepeat
crée une nouvelle portée avec une nouvelle montre. Donc ... après 10 traversées, vous obtenez une erreur.
Comment le réparer
- Ne créez pas de nouveaux objets à chaque
getEntities()
appeler.
- Si vous devez créer de nouveaux objets, vous pouvez ajouter
hashKey
méthode pour eux. Voir ce sujet par exemple.
J'espère que les personnes qui connaissent les rouages d'AngularJS me corrigeront si je me trompe.