2016-06-28 14 views
3

Ich verwende NGRX/store, NGRX/Effekte und NGRX/Router.Wenn sich die Seite ändert, was kann das Laden aller Geschäftszustände auslösen?

Meine Effekte wie diese sind:

@Effect() loadOneProduct$ = this.updates$ 
    .whenAction(LOAD_ONE_PRODUCT) 
    .switchMap(() => this.productService.loadOneProduct()) 
    .map(oneProduct => ({ type: LOAD_ONE_PRODUCT_SUCCESS, payload: oneProduct })); 

@Effect() loadOneWorker$ = this.updates$ 
    .whenAction(LOAD_ONE_WORKER) 
    .switchMap(() => this.workerService.loadOneWorker()) 
    .map(oneWorker => ({ type: LOAD_ONE_WORKER_SUCCESS, payload: oneWorker })); 

Am Anfang wie dies der Laden Zustand:

{ 
    company: { name: 'Google' }, 
    products: {}, 
    workers: {} 
} 

1) Nach dem Ausführen this.store.dispatch({ type: LOAD_ONE_PRODUCT }); wird es wie folgt aus:

{ 
    company: { name: 'Google' }, 
    products: { 
    oneProduct: { 
     label: 'Phone' 
    } 
    }, 
    workers: {} 
} 

2) Nach dem Lauf this.store.dispatch({ type: LOAD_ONE_WORKER }); wird es so:

{ 
    company: { name: 'Google' }, 
    products: { 
    oneProduct: { 
     label: 'Phone' 
    } 
    }, 
    workers: { 
    oneWorker: { 
     name: 'Tom' 
    } 
    }, 
} 

3) Als nächstes, wenn ich auf eine andere Seite gehen,

{{store|async|json}} 

ngOnInit() 
{ 
    this.subscription = this.store 
     .select(x => x.products && x.products.oneProduct) 
     .subscribe(oneProduct => { 
     // Got undefined here. I suppose I can get the latest value from the store 
     console.log(oneProduct); 
     }); 

    // Everything will become correct if I `dispatch` any action 
    // And I created a action called TEST, no reducer for it, which means won't change store state, also works 
} 

Und jetzt {{store|async|json}} zeigt:

{ 
    company: { name: 'Google' }, 
    products: {}, 
    workers: {} 
} 

Alle meine Staaten geht in den Ausgangszustand zurück. Nicht nur products verschwindet, sondern auch workers verschwindet. (ANMERKUNG:. workers verschwindet auch)

(. Doch in Chrome Extention Redux Werkzeuge, die Zustandsbaum zeigt korrekt die ganze Zeit)

Wenn ich eine Schaltfläche hinzufügen und manuell ChangeDetectorRef verwenden, tun this._cdRef.detectChanges();, {{store|async|json}} zeigt immer noch den Anfangszustand an. (So ​​scheint nicht im Zusammenhang mit der Zone)

Allerdings, wenn ich einige Aktionen nach, sowohl products und workers werden wieder in den Zustand kommen. Und {{store|async|json}} zeigt auch richtig.

Da in den Chrome Extention Redux Tools der Statusbaum immer korrekt angezeigt wird. Also ich denke es wird einfach nicht richtig geladen. Meine Frage ist, wenn sich die Seite ändert, was kann das Laden aller Geschäftszustände auslösen? Dank

+0

warm/kalt beobachtbar? Wenn Sie abonnieren, erhalten Sie den Anfangswert? –

+0

@DerekKite Ja, ich habe einen Anfangswert, der 'undefiniert' ist. Tatsächlich geht mein ganzer Ladenzustand in diesem Moment in den Anfangszustand. –

+0

Hat die effects-Funktion das beobachtbare loadOneProduct $ nicht im Gegensatz zum Zustand geändert? In der Beispielanwendung löst der letzte Kartenaufruf LOAD_ONE_WORKER_SUCCESS aus, der dann im Reduzierer den Status aktualisiert. Vielleicht wird der Zustand nicht geändert. Übrigens, ich weiß es wirklich nicht, ich denke mir das aus. –

Antwort