"async" pipe rendern den Stream nicht

8

Der Versuch, die Fenstergröße bei der Fenstergrößenänderung durch einen Stream in einer eckigen 2-Komponente unter Verwendung von async pipe zu rendern:

<h2>Size: {{size$ | async | json}}</h2>

%Vor%

Aber die Komponente rendert nur den Anfangszustand und ignoriert die Stream-Aktualisierungen. Wenn Sie die Konsole öffnen, sehen Sie bei der Größenänderung des Fensters die Updates von demselben Stream.

Ich kann nicht verstehen, was ich hier vermisse.

Hier ist ein Plocker

    
Birowsky 19.02.2016, 19:05
quelle

2 Antworten

9

Der Ereignishandler wird außerhalb der Angular-Zone ausgeführt, sodass die Angular Change-Erkennung nicht ausgeführt wird, wenn ein Ereignis ausgelöst wird. Setzen Sie den Event-Handler in Ihre Komponente und es wird dann zusammen mit allen anderen asynchronen Ereignissen affe-gepatcht. Die Angular Change-Erkennung wird also nach jedem Ereignis ausgeführt (und aktualisiert die Ansicht):

%Vor%

Plunker

Eine weitere Option, die in den Kommentaren erläutert wird, besteht darin, die Änderungserkennung manuell auszuführen , wenn ein Ansichtsmodell aktualisiert wird:

%Vor%

Plunker

Beachten Sie, dass Sie stattdessen versuchen möchten, ApplicationRef.tick() einmal auszuführen, z. B. in Ihrer Root-Komponente, die die Änderungserkennung für alle Komponenten ausführt, anstatt ChangeDetectorRef.detectChanges() in jeder Komponente auszuführen. (Und möglicherweise müssen Sie tick() in eine setTimeout() -Methode einfügen, um sicherzustellen, dass alle Komponentenansichtsmodelle aktualisiert wurden ... Ich bin nicht sicher, ob alle do() -Rückrufmethoden ausgeführt werden - dh wenn sie alle in einer Runde der JavaScript-VM ausgeführt werden oder wenn mehrere Abbiegungen beteiligt sind.)

    
Mark Rajcok 19.02.2016, 19:26
quelle
13

Da mein Ziel darin bestand, die Fenstergrößenströme in einem anderen Modul zu abstrahieren, versiegelte anscheinend nur das Umschließen der Streams in einer Klasse das Geschäft:

"Dies ist die Zukunft" Version:

%Vor%

"Oma" Version:

%Vor%

Obwohl ich Klasse / Service in diesem Modul nicht wollte, nur klare / plattformunabhängige Konstrukte, war dies die einzige saubere Methode, die für eckig funktionierte, ohne sich um das Auslösen von Zonenupdates kümmern zu müssen.

    
Birowsky 20.02.2016 13:50
quelle