2016-06-02 13 views
10

IchObservable.subscribe() funktioniert nur einmal (NGRX angular2)

constructor(private someService: SomeService){ 
     someService.someObservable.subscribe((data: Some)=> { 
      this.some = data; 
      console.log('changed'); 
     }); 
} 

Im Dienst in einer Komponente Konstruktor einer Speichereigenschaft abonnieren, sieht der Konstruktor wie folgt aus:

constructor(private store: Store<any>){ 
     this.someObservable = <Observable<{}>>store.select('some'); 
} 

Ich ändere den Zustand dieses Objekts, aber die Protokollierung erscheint nur einmal. Was ist auch seltsam ist, dass ich auf die this.some Eigenschaft direkt in meiner Vorlage (ohne async Rohr) zugreifen, und es wird perfekt aktualisiert! Es scheint, als ob die this.some Eigenschaft aktualisiert wird, aber die next() im Abonnement funktioniert nicht.

jemandem helfen? Vielen Dank!

+2

Wie sieht Ihr Service aus? – paulpdaniels

+0

Im Server Konstruktor exponiere ich das 'Observable' wie folgt:' this.some = > store.select ('irgendein') ' –

+0

Ich bin verwirrt. Ist "etwas" und Beobachtbar oder Ihre Daten? Können Sie Ihrem Beispiel mehr vollständigen Code hinzufügen? Vorzugsweise etwas, das ausgeführt werden kann und das Problem reproduzieren kann? – paulpdaniels

Antwort

1

Sie sollten keine Dienste im Konstruktor aufrufen und es wird als eine schlechte Praxis angesehen. Verwenden Sie die ngOnInit() -Methode, um einen Service zu abonnieren. Diese Methode wird beim Laden der Komponente automatisch aufgerufen.

Versuchen Sie, dies könnte Ihr Problem lösen.

import {Component, OnInit} from "@angular/core"; 

export class YourComponent implements OnInit{ 

    ngOnInit():void { 
     //handle your subscription here 
    } 

} 
+1

Funktioniert nicht. Vielleicht hat es etwas mit 'ChangeDetectionStrategy' zu tun? –

+1

Ihr Rat ist an Ort und Stelle, aber das beantwortet die Frage nicht.Das Platzieren von Berechnungen in Ihrem Konstruktor verzögert nur die Instanziierung des Objekts und Sie können nicht auf die Eigenschaften – svarog

+0

@svarog zugreifen, da es tatsächlich keine Verzögerung verursacht, weil beobachtbar asynchron ist. Der richtige Weg zur Implementierung ist wie von "icsapper" vorgeschlagen. – Pradeep

0

Achten Sie darauf, ein neues Objekt aus Ihrem Minderer zurückkehren, wenn Sie eine Immobilie aktualisieren und dasselbe Objekt zurückgeben nicht speichern Aktualisierungsereignis

Schalter (action.type) {

case MAIN_MENU_TOGGLE : { 
auslösen würde,

Ex Rückkehr Object.assign ({}, appSettings, {isMainMenuExpand: flag}) }

+0

Ich mache es, das ist nicht das Problem –

1

In meinem sehr ähnlichen Fall war das Problem, dass eine der s ubscription handlers warf einen Fehler. Wenn ein Fehler auftritt, hört der beobachtbare Stream auf, neue Werte auszugeben.

Verwandte Themen