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

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

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

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

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

76 голосов | спросил matsko 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 17 Sep 2012 20:57:34 +0400 2012, 20:57:34

2 ответа


0

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

  1. Взаимодействие пользователя с вводом HTML ( 'text' , ' номер ', ' url , электронная почта , 'radio' , 'флажок' ). AngularJS имеет inputDirective . Входные данные 'text', 'number', 'url' и 'email' связывают обработчик слушателя для событий 'input' или 'keydown'. Обработчик слушателя вызывает область действия. $ Apply . 'radio' и 'checkbox' связывают аналогичный обработчик для события click.
  2. Взаимодействие пользователя с выбранным элементом. AngularJS имеет selectDirective с похожими поведение при изменении события.
  3. Периодические изменения с использованием $ timeout service это также делает $ rootScope. $ apply ( ) .
  4. eventDirectives () ) также используйте scope. $ apply .
  5. $ http также использует $ rootScope. применить () .
  6. Изменения вне мира AngularJS должны использовать scope. $ apply, как вы знаете.
ответил Artem Andreev 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 19 Sep 2012 12:52:58 +0400 2012, 12:52:58
0

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

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

ответил dain 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 19 Sep 2012 04:23:49 +0400 2012, 04:23:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132