Коротка відповідь : чи дійсно вам потрібна така функція чи ви можете користуватися властивістю? http://jsfiddle.net/awnqm/1/
Довга відповідь
Для простоти опишу лише ваш випадок - ngRepeat для масиву об’єктів. Також я опущу деякі деталі.
AngularJS використовує брудну перевірку для виявлення змін. При запуску програми воно працює $digestдля $rootScope. $digestзробить першу глибину обходу для ієрархії діапазону . У всіх областях є список годинників. Кожен годинник має останнє значення (спочатку initWatchVal). Для кожного діапазону для всіх годин $digestвін працює, отримує поточне значення ( watch.get(scope)) і порівнює його watch.last. Якщо поточне значення не дорівнює watch.last(завжди для першого порівняння) $digestвстановлюється dirtyдо true. Коли всі діапазони обробляються, якщо dirty == true $digestпочинається чергове проходження першої глибини $rootScope. $digestзакінчується, коли брудне == хибне або кількість об’їздів == 10. В останньому випадку помилка "10 доларів дайджесту () досягнуто ітерацій." буде зареєстровано.
Тепер про ngRepeat. Для кожного watch.getдзвінка він зберігає об'єкти з колекції (повертає значення getEntities) з додатковою інформацією в кеші ( HashQueueMapза 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, виправлять мене, якщо я в чомусь помиляюся.