Як знайти, яка асинхронна дія запускає ngZone (що призводить до виявлення змін)?


11

Будь-які зміни в сліді стеку оновлень завжди призводять до globalZoneAwareCallback. Як ви дізнаєтесь, що спричинило зміни?

У плані налагодження добре мати чітку картину.


Хочете пояснити?
користувач2167582

Ваше запитання абсолютно неоднозначне!
nimeresam

@nimeresam Як це? з її загальним я згоден, але неоднозначний?
користувач2167582

2
Я оновив питання, сподіваюся, що це допоможе вам
Степан Суворов

Відповіді:


31

globalZoneAwareCallback- це функція, оголошена в zonejs для обробки всіх зворотних викликів подій capture=false. (btw, бо capture=trueє globalZoneAwareCaptureCallback)

Це означає, що будь-який слухач подій спочатку пройде цей метод. Цей слухач може бути доданий на сторінку Angular, ви або будь-якою стороною бібліотекою.

Існує багато способів того, як ми можемо слухати події браузера в Angular:

  • підписатися на події браузера <element (event)="callback()">

  • @HostListener декоратор @HostListener('event') callback() {}

  • Renderer2.listen метод

  • rxjs fromEvent

  • призначити властивість елемента element.on<event> = callback

  • метод addEventListener element.addEventListener(event, callback)(цей метод використовується внутрішньо багатьма іншими способами вище)

Після того, як ви всередині, globalZoneAwareCallbackотримаєте доступ до всіх завдань Зони, які слід запустити.

Давайте уявимо, що ми слухаємо clickподію на document.body:

document.body.addEventListener('click', () => {
   // some code
});

Давайте відкриємо інструменти для розробників Chrome, щоб мати чітке зображення:

введіть тут опис зображення

Що ми тільки що відкрили:

  • кожне завдання зони містить джерело, і саме це викликає зміни

  • властивість target показує, який об'єкт запускає зміни

  • властивість зворотного виклику може привести нас до обробника змін

Розглянемо ще один приклад та додамо подію клацання за допомогою кутового способу:

<h2 class="title" (click)="test()">Hello {{name}}</h2>

Після натискання на цей h2елемент ми повинні спостерігати наступне:

введіть тут опис зображення

Ви можете бути здивовані , що тепер на зворотний дзвінок властивість не призведе нас до функції testзворотного виклику одразу, а ми показали деяку обгортку від @angular/platform-browser package. І інші випадки також можуть відрізнятися, але властивість ZoneTask.source зазвичай є всім, що вам потрібно в цих випадках, оскільки воно показує вам першопричину змін .


Дякую, сер, це була чудова відповідь. Я хотів би, щоб я міг подвоїти суму.
користувач2167582
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.