2017-01-24 3 views
-1

TLDR: Observable-Objekt löst keine erneute Komponentenzerlegung aus, bis vom Benutzer eine Aktion ausgeführt wird (klicken Sie zum Beispiel auf eine Schaltfläche).Angular2 Observable löst das erneute Rendern nicht aus

Ich aktualisiere ein Observable, das von einem BehaviorSubject unterstützt wird, das in einem Service enthalten ist, der in meine Komponente injiziert wird.

In meiner Komponente verwende ich eine einfache *ngIf="myObservable$ | async", um ein div anzuzeigen.

ich es geschafft, zwei Situationen zu replizieren, ein Arbeits- und ein, das nicht, aber ich kann nicht verstehen, was der Unterschied ist:

//CASE 1 
this._mySubject$.next(true); //THIS DOES TRIGGER RERENDERING 
//CASE 2 
this.http.get(url) 
.map(res => res.json()) 
.subscribe(body => { 
    this._mySubject$.next(true); //THIS DOESN'T TRIGGER RERENDERING UNTIL AN ACTION IS MADE 
}); 
+2

Wie wird der gesamte Stream ausgelöst? Und welche Version von angular2 benutzt du? - Sie können Ihr Problem wahrscheinlich lösen, indem Sie das '.next (true)' in ein 'ngZone.run (...) 'hüllen - dies sollte jedoch bei einem einfachen Rest-Call nicht notwendig sein rest-call ist irgendwie in einen anderen asynchronen/externen Trigger eingebunden – olsn

+0

Ich benutze Angular 2.1.0. Meine Komponente, die bereits das Observable abonniert hat, ruft die Service-Funktion auf, die den einfachen http-Aufruf (nicht in irgendwas verpackt) ausführt. – Yanis26

+0

Gibt es einen besonderen Grund, den Block 'subcribe()' zum Aufruf von '.next()'? Abonnentenblöcke sollten nicht verwendet werden, um Nebenwirkungen zu erzeugen. Nur der oder die Endverbraucher des Observablen sollten abonnieren. – AngularChef

Antwort

0

Wenn Sie Nebenwirkungen tun müssen, versuchen Sie es in der zu tun tut Betreiber

this.http.get(url) 
.map(res => res.json()) 
.do(() => this._mySubject$.next(true)) 
.subscribe(); 
+0

Ich habe auch versucht auf diese Weise und es löst immer noch nicht neu zu rendern. – Yanis26

+0

@ Yanis26 Bei der Vorlage machst du '* ngIf =" _ mySubject $ | async "' ?? –

+0

Ich verwende das Observable meines BehaviorSubject in meiner Vorlage ('_.mySubject $ .asObservable()'), damit die Komponente die Daten nicht mutieren kann. Was ist seltsam ist, dass ich das mit 3 anderen BehaviorSubject/Observable mit dem gleichen Setup tun: http-Anfrage -> Push-Daten in meinem Thema erhalten -> die Komponente selbst aktualisiert. Nur dieser funktioniert nicht und es ist ziemlich frustrierend, da alles andere genauso gemacht wird. – Yanis26

0

Es könnte eine bessere Idee, um das Verhalten Subjekt in der ngOnInit Methode zu abonnieren und eine Eigenschaft zu verwenden, in der ngIf gesetzt. Da das tatsächliche Objekt kein neues Objekt ist, sondern nur eine neue Emission von dem Verhaltensobjekt, löst es wahrscheinlich Angulars Änderungsdetektion nicht aus. Es scheint am besten mit unveränderlichen Objekten zu spielen.

Verwandte Themen