Jak znaleźć, która akcja asynchroniczna wyzwala ngZone (która prowadzi do wykrywania zmian)?

11

Wszelkie zmiany w stosie aktualizacji aktualizacji zawsze prowadzą z powrotem do globalZoneAwareCallback. Jak dowiedzieć się, co spowodowało zmianę?

Jeśli chodzi o debugowanie, dobrze jest mieć wyraźny obraz.

użytkownik2167582
źródło
Chcesz to wyjaśnić?
user2167582,
Twoje pytanie jest całkowicie dwuznaczne!
nimeresam
@nimeresam Jak to zrobić? zgadzam się z generałem, ale niejednoznacznym?
user2167582,
2
Zaktualizowałem pytanie, mam nadzieję, że to ci pomoże
Stepan Suvorov,

Odpowiedzi:

31

globalZoneAwareCallbackto funkcja zadeklarowana w zonejs do obsługi wszystkich wywołań zwrotnych zdarzeń za pomocą capture=false. (btw, bo capture=truejest globalZoneAwareCaptureCallback)

Oznacza to, że każdy detektor zdarzeń najpierw przejdzie tę metodę. Ten detektor może zostać dodany na stronie przez Angular, przez ciebie lub dowolną bibliotekę strony trzeciej.

Istnieje wiele sposobów słuchania zdarzeń przeglądarki w Angular:

  • subskrybuj zdarzenie przeglądarki <element (event)="callback()">

  • @HostListener dekorator @HostListener('event') callback() {}

  • Renderer2.listen metoda

  • rxjs fromEvent

  • przypisać właściwość elementu element.on<event> = callback

  • metoda addEventListener element.addEventListener(event, callback)(ta metoda jest używana wewnętrznie na wiele innych sposobów powyżej)

Gdy znajdziesz się w środku globalZoneAwareCallback, masz dostęp do wszystkich zadań strefy, które powinny zostać uruchomione.

Wyobraźmy sobie, że słuchamy clickwydarzenia na document.body:

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

Otwórzmy narzędzia programistyczne Chrome, aby uzyskać wyraźny obraz:

wprowadź opis zdjęcia tutaj

Co właśnie odkryliśmy:

  • każde zadanie strefy zawiera źródło, więc to powoduje zmianę

  • Właściwość target pokazuje, który obiekt wyzwala zmianę

  • Właściwość wywołania zwrotnego może doprowadzić nas do modułu obsługi zmiany

Rozważmy inny przykład i dodajmy zdarzenie click za pomocą Angular:

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

Po kliknięciu tego h2elementu powinniśmy przestrzegać następujących zasad:

wprowadź opis zdjęcia tutaj

Możesz być zaskoczony, że teraz właściwość wywołaniatest zwrotnego nie od razu doprowadziła nas do wywołania zwrotnego, ale raczej pokazaliśmy opakowanie @angular/platform-browser package. A także inne przypadki mogą się różnić, ale ZoneTask.source nieruchomość jest zwykle wszystko trzeba w tych sprawach, ponieważ pokazuje ci przyczynę zmiany .

yurzui
źródło
Dziękuję, proszę pana, to była świetna odpowiedź. Chciałbym podwoić nagrodę.
user2167582,