Вы должны знать о том, как работает AngularJS, чтобы понять это.
Цикл дайджеста и объем $
Прежде всего, AngularJS определяет концепцию так называемого цикла дайджеста . Этот цикл можно рассматривать как цикл, в течение которого AngularJS проверяет, есть ли какие-либо изменения во всех переменных, наблюдаемых всеми $scope
s. Таким образом, если вы $scope.myVar
определили в своем контроллере, и эта переменная была помечена для отслеживания , то вы неявно говорите AngularJS следить за изменениями на myVar
каждой итерации цикла.
Естественным последующим вопросом будет: все ли привязано к $scope
наблюдению? К счастью, нет. Если вы будете следить за изменениями в каждом объекте $scope
, то для быстрого цикла дайджеста потребуется несколько десятков лет, и вы быстро столкнетесь с проблемами производительности. Вот почему команда AngularJS дала нам два способа объявить некоторые$scope
переменной как наблюдаемой (см. Ниже).
$ watch помогает прослушивать изменения $ scope
Есть два способа объявления $scope
переменной как наблюдаемой.
- Используя его в своем шаблоне через выражение
<span>{{myVar}}</span>
- Добавляя его вручную через
$watch
сервис
Объявление 1) Это наиболее распространенный сценарий, и я уверен, что вы видели его раньше, но вы не знали, что это создало часы на заднем плане. Да, это было! Использование директив AngularJS (таких какng-repeat
) также может создавать неявные часы.
Объявление 2) Так вы создаете свои собственные часы . $watch
Сервис помогает вам запустить некоторый код, когда какое-либо значение, прикрепленное к $scope
, изменилось. Это редко используется, но иногда полезно. Например, если вы хотите запускать некоторый код каждый раз, когда изменяется myVar, вы можете сделать следующее:
function MyController($scope) {
$scope.myVar = 1;
$scope.$watch('myVar', function() {
alert('hey, myVar has changed!');
});
$scope.buttonClicked = function() {
$scope.myVar = 2; // This will trigger $watch expression to kick in
};
}
$ apply позволяет интегрировать изменения с циклом дайджеста
Вы можете думать о $apply
функции как о интеграционном механизме . Видите ли, каждый раз, когда вы меняете какую-то отслеживаемую переменную, прикрепленную к$scope
непосредственно объекту, AngularJS будет знать, что изменение произошло. Это потому, что AngularJS уже знал, чтобы отслеживать эти изменения. Поэтому, если это происходит в коде, управляемом фреймворком, цикл дайджеста будет продолжен.
Однако иногда вы хотите изменить какое-то значение за пределами мира AngularJS и увидеть, как эти изменения распространяются нормально. Учтите это - у вас есть $scope.myVar
значение, которое будет изменено в $.ajax()
обработчике jQuery . Это произойдет в какой-то момент в будущем. AngularJS не может ждать, пока это произойдет, поскольку ему не было приказано ждать на jQuery.
Чтобы заняться этим, $apply
был введен. Это позволяет явно запустить цикл пищеварения. Однако вы должны использовать это только для переноса некоторых данных в AngularJS (интеграция с другими фреймворками), но никогда не используйте этот метод в сочетании с обычным кодом AngularJS, так как тогда AngularJS выдаст ошибку.
Как все это связано с DOM?
Что ж, вы должны действительно следовать учебнику снова, теперь, когда вы все это знаете. Цикл дайджеста гарантирует, что пользовательский интерфейс и код JavaScript остаются синхронизированными, оценивая каждый наблюдатель, прикрепленный ко всем $scope
s, пока ничего не меняется. Если в цикле дайджеста больше не происходит изменений, то он считается завершенным.
Вы можете прикрепить объекты к $scope
объекту либо явно в Контроллере, либо объявив их в {{expression}}
форме непосредственно в представлении.
Я надеюсь, что это поможет уточнить некоторые базовые знания обо всем этом.
Дальнейшие чтения: