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