Вы должны знать о том, как работает AngularJS, чтобы понять это.
Цикл дайджеста и объем $
Прежде всего, AngularJS определяет концепцию так называемого цикла дайджеста . Этот цикл можно рассматривать как цикл, в течение которого AngularJS проверяет, есть ли какие-либо изменения во всех переменных, наблюдаемых всеми $scopes. Таким образом, если вы $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 остаются синхронизированными, оценивая каждый наблюдатель, прикрепленный ко всем $scopes, пока ничего не меняется. Если в цикле дайджеста больше не происходит изменений, то он считается завершенным.
Вы можете прикрепить объекты к $scopeобъекту либо явно в Контроллере, либо объявив их в {{expression}}форме непосредственно в представлении.
Я надеюсь, что это поможет уточнить некоторые базовые знания обо всем этом.
Дальнейшие чтения: