Как работает связывание и переваривание в AngularJS?

Одна вещь, которая выделяет AngularJS из других фреймворков JavaScript-MVC, - это способность эхоцитировать связанные значения из JavaScript в HTML с помощью привязок. Angular делает это автоматически, когда вы назначаете какое-либо значение переменной $scope.

Но как автоматическое это? Иногда Angular не будет получать изменения, поэтому мне нужно вызвать $scope. $Apply() или $scope. $Digest(), чтобы сообщить Angular, чтобы получить изменение. Иногда, когда я запускаю любой из этих методов, он выдает ошибку и говорит, что дайджест уже выполняется.

Так как привязки (что-либо внутри {{}} фигурных скобок или ng-атрибутов) повторяются с eval, значит ли это, что Angular постоянно запрашивает объект $scope для поиска изменений, а затем выполняет eval, чтобы подтолкнуть эти изменения в DOM/HTML? Или AngularJS каким-то образом выяснил использование магических переменных, которые запускают события, которые запускаются при изменении или назначении переменной? Я никогда не слышал о том, что он полностью поддерживается всеми браузерами, поэтому я сомневаюсь.

Как AngularJS отслеживает его привязки и переменные области видимости?

Ответ 1

В дополнение к разделу , найденному Марком, я думаю, мы можем попытаться перечислить все возможные источники изменений.

Ответ 2

Как вы выяснили, это не опрос, а использование его внутреннего цикла выполнения, так что вам нужно использовать $apply() или $digest(), чтобы начать игру.

Объяснение Мишко довольно тщательное, но недостающий бит состоит в том, что Angular просто пытается заставить $scope вернуться к явному внутреннему состоянию всякий раз, когда что-либо происходит внутри его собственный контекст. Это может привести к некоторому подпрыгиванию между состояниями модели, поэтому вы также не можете полагаться на стрельбу $watch() только один раз, а также почему вы должны быть осторожны с ручной настройкой отношений между моделями или вы окажетесь в бесконечном круговые обновления.