我正在使用ngrx/store,ngrx/effects和ngrx/router。當頁面更改時,可以觸發加載所有存儲狀態的內容是什麼?
我的影響是這樣的:
@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 }));
在開始的時候,店裏的狀態是這樣的:
{
company: { name: 'Google' },
products: {},
workers: {}
}
1)運行this.store.dispatch({ type: LOAD_ONE_PRODUCT });
後,就變成這樣:
{
company: { name: 'Google' },
products: {
oneProduct: {
label: 'Phone'
}
},
workers: {}
}
2)運行後this.store.dispatch({ type: LOAD_ONE_WORKER });
,變成這樣:
{
company: { name: 'Google' },
products: {
oneProduct: {
label: 'Phone'
}
},
workers: {
oneWorker: {
name: 'Tom'
}
},
}
3)接下來,當我去到另一個網頁,
{{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
}
現在{{store|async|json}}
顯示:
{
company: { name: 'Google' },
products: {},
workers: {}
}
所有我的狀態返回到初始狀態。不僅products
消失,而且workers
消失。 (注:workers
也消失)
(但是,在Chrome Extention終極版工具,狀態樹顯示正確的所有的時間)
如果我添加一個按鈕,手動使用ChangeDetectorRef,做this._cdRef.detectChanges();
, {{store|async|json}}
仍顯示初始狀態。 (所以似乎沒有區域相關)
但是,如果我派遣一些行動之後,products
和workers
都會回到狀態。並且{{store|async|json}}
也正確顯示。
由於在Chrome Extention Redux Tools中,狀態樹一直顯示正確。所以我想它只是不正確加載。我的問題是當頁面發生變化時,什麼會觸發加載所有存儲狀態?由於
熱/冷觀察到的?當你訂閱你獲得初始值? –
@DerekKite是的,我得到了初始值,這是'undefined'。其實我的整個商店狀態在那個時候都處於初始狀態。 –
效果函數不會改變可觀察的loadOneProduct $而不是狀態嗎?在示例應用程序中,最後的地圖調用將分派到LOAD_ONE_WORKER_SUCCESS,然後在reducer中更新狀態。也許國家沒有被修改。順便說一句,我真的不知道,我正在搞清楚這些東西。 –