Вам потрібно знати, як працює AngularJS, щоб зрозуміти це.
Дайджест циклу і $ сфера
Перш за все, AngularJS визначає концепцію так званого дайджест-циклу . Цей цикл можна розглядати як цикл, під час якого AngularJS перевіряє, чи є якісь зміни всіх змінних, які спостерігаються всіма $scopes. Отже, якщо ви $scope.myVarвизначили у своєму контролері і ця змінна була позначена як переглянута , ви неявно говорите AngularJS стежити за змінами myVarв кожній ітерації циклу.
Природним наступним запитанням було б: чи все пов'язане з $scopeпереглядом? На щастя, ні. Якщо ви будете спостерігати за змінами кожного об'єкту у вашому $scope, то швидко оцінювальний цикл потребуватиме вікових оцінок, і ви швидко зіткнетеся з проблемами продуктивності. Ось чому команда AngularJS дала нам два способи оголошення певної $scopeзмінної як переглянутої (читайте нижче).
$ watch допомагає слухати зміни в обсязі $
Є два способи оголошення $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}}формі безпосередньо у поданні.
Я сподіваюся, що це допоможе з’ясувати деякі основні знання про все це.
Подальші читання: