Я пытался подключить временную функцию для тестирования, которая вернула случайную дату для отображения на мой взгляд. Это было ошибкой, потому что она застряла в цикле, поэтому я подумал, что переключение на одностороннее связывание будет работать, но проблема не исчезнет. Фактическая ошибка:
[$rootScope:infdig] 10 $digest() iterations reached. Aborting!
При привязке к вызову метода, который возвращает случайное значение, почему Angular застревает в бесконечном цикле? Должно ли выражение перестать оценивать, как только оно вернет значение, которое не undefined
?
Пример plunk
Примечание. Я не ищу исправления. Я уже заменил вызов функции одноразовым случайным значением, но мне любопытно узнать, почему одноразовая привязка продолжает оцениваться после того, как модель должна иметь (из моего понимание) стабильный.
Чтобы понять, почему это происходит, вам нужно понять цикл дайджеста.
Грязная проверка
Угловая основана на "грязной проверке". Угловая, по сути, выполняет итерацию по всем свойствам в $scope
чтобы увидеть, что изменилось. Если есть какое-либо изменение в каком-либо свойстве, Angular запускает всех наблюдателей за этими свойствами, чтобы сообщить им об изменении
И поскольку часы могут изменять свойства в области, Angular запускает очередной раунд грязной проверки после того, как часы сделаны. Цикл пищеварения прекращается, когда он повторяется по всем свойствам, и он видит, что ни один из них не изменился.
Бесконечный дайджест возникает, когда часы всегда устанавливают новое значение для свойства, которое непрерывно происходит в Math.random()