Краткий ответ : действительно ли вам нужна такая функция или можно использовать собственность? http://jsfiddle.net/awnqm/1/
Длинный ответ
Для простоты опишу только ваш случай - ngRepeat для массива объектов. Также я опущу некоторые детали.
AngularJS использует грязную проверку для обнаружения изменений. При запуске приложения оно работает $digestдля $rootScope. $digestвыполнит обход в глубину для иерархии области видимости . У всех прицелов есть список часов. Каждые часы имеют последнее значение (изначально initWatchVal). Для каждой области видимости для всех часов $digestон запускается, получает текущее значение ( watch.get(scope)) и сравнивает его с watch.last. Если текущее значение не равно watch.last(всегда для первого сравнения), $digestустанавливается dirtyв true. Когда все области видимости обрабатываются, if dirty == true $digestначинает еще один обход в глубину из $rootScope. $digestзаканчивается, когда dirty == false или количество обходов == 10. В последнем случае выдается ошибка «Достигнуто 10 итераций $ digest ()». будет зарегистрирован.
Теперь о ngRepeat. Для каждого watch.getвызова он сохраняет объекты из коллекции (возвращающее значение getEntities) с дополнительной информацией в кеше ( HashQueueMapby hashKey). При каждом watch.getвызове ngRepeatпытается получить объект hashKeyиз кеша. Если он не существует в кеше, ngRepeatсохраняет его в кеше, создает новую область видимости, помещает в нее объект, создает элемент DOM и т . Д.
Теперь о hashKey. Обычно hashKeyэто уникальный номер, генерируемый nextUid(). Но это может быть функция . hashKeyпосле создания сохраняется в объекте для использования в будущем.
Почему ваш пример генерирует ошибку : функция getEntities()всегда возвращает массив с новым объектом. У этого объекта нет hashKeyи не существует в ngRepeatкеше. Таким образом, ngRepeatкаждый watch.getгенерирует для него новые возможности с новыми часами {{entity.id}}. Это смотрела на первых watch.getпорах watch.last == initWatchVal. Итак watch.get() != watch.last. Итак, $digestначинается новый траверс. Таким образом ngRepeatсоздается новая сфера применения новых часов. Итак ... после 10 ходов вы получаете ошибку.
Как это исправить
- Не создавайте новые объекты при каждом
getEntities()вызове.
- Если вам нужно создать новые объекты, вы можете добавить
hashKeyдля них метод. Примеры см. В этой теме .
Надеюсь, люди, знающие внутренности AngularJS, поправят меня, если я в чем-то ошибаюсь.