$ застосувати vs $ дайджест у тестуванні директив


98

Якщо у мене є директива, яка відповідає статусу певного атрибута в області застосування, і я хочу змінити цей атрибут у своєму тесті та переконатися, що він відповідає правильно, який найкращий спосіб зробити цю зміну?

Я бачив обидві ці схеми:

scope.$apply(function() {
    scope.myAttribute = true;
});

і

scope.myAttribute = true;
scope.$digest();

У чому різниця між ними, а яка краще і чому?

Відповіді:


206

scope.$digest()буде стріляти з вахти на нинішню сферу, і на всіх її дітей теж. scope.$applyоцінить передану функцію та запустить $rootScope.$digest().

Перший - швидше, оскільки йому потрібно оцінити спостерігачів за поточним розмахом та його дітьми. Другий - повільніше, тому що його потрібно оцінювати спостерігачам, $rootScopeі все це стосується області дитини.

Коли в одному з спостерігачів виникає помилка, і ви користуєтесь scope.$digest, вона не обробляється через $exceptionHandlerсервіс, тому вам потрібно обробляти виняток самостійно. scope.$applyвикористовує try-catchблок внутрішньо і передає всі винятки до $exceptionHandler.


1
Чи будуть $digestтакож закликатися діти сфери?
пілав

15
Це може ввести в оману. $digestне лише спостерігачі за вогнем на сьогоднішній день, але й на всіх його дітей.
tasseKATT

@tasseKATT, я думаю, я захопив те, що пропонує ваш коментар.
activedecay

12

Як згадується в самій документації, цикл дайджестів $ формується в будь-який час $scope.$apply. Відповідно до посібника для розробника щодо обсягу

Після оцінки виразу метод $ apply виконує дайджест $. На етапі дайджесту $ область розглядає всі вирази $ watch і порівнює їх з попереднім значенням.

І відповідно до документації щодо API сфери застосування

Зазвичай ви не називаєте $ digest () безпосередньо в контролерах чи в директивах. Натомість виклик до $ apply () (як правило, в межах директив) примусить дайджест $ ().

Тож не слід явно телефонувати $digest, $applyметод виклику викликає цикл дайджесту.


8
це неправда, оскільки дайджест достатній для більшості випадків, коли потрібно оцінювати лише нинішню сферу застосування та її дітей. це правда, що $ range. $ застосовує виклики $ дайджест всередині, але дуже важливо пам’ятати, що в кінцевому підсумку викличе $ rootScope. $ digest () і, отже, дуже важко
Srivathsa Harish Venkataramana
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.