簡體   English   中英

在NgRx效應中重建狀態

[英]Repopulating state in an NgRx Effect

我的JSON在我的效果中最初是一個JSON.stringify(state),需要將該JSON字符串添加回狀態以更新應用程序。 (Angular和NgRx / Redux新手)。

我有這樣的效果(我可能做錯了):

@Effect({ dispatch: false })
upState$ = this.actions$.pipe(
   ofType(WorkspaceActionTypes.UpState),
   withLatestFrom(this.store.select(fromSpace.getState)),
   tap(([empty, space]) => {
        console.log(JSON.stringify(space));

       var json = "my json file in string form";
       space = json;
   })

);

json不能從字符串轉到類型狀態。

更新:

在查看注釋中的鏈接后,我是否應該創建一個調用動作調用reducer來更新狀態的效果? 我從鏈接中看到了這個但不知道如何使用它:

@Effect() 
createArticle$: Observable<Action> = this.actions$
 .ofType<fromActions.CreateAction>(fromActions.CREATE)
 .map(action => action.payload)
 .mergeMap(article => 
     this.articleService.createArticle(article)
     .map(res => new fromActions.CreateSuccessAction(res)) 
     .catch(error => of(new fromActions.CreateFailureAction(error)))
 ); 

你能為減速機添加代碼嗎? 您應該在效果中反序列化JSON字符串。 然后,效果應該發送一個由減速器捕獲的動作。 然后你的reducer更新狀態(它是redux / ngrx中允許這樣做的唯一函數)。 它通常看起來像:

switch(action.type){

//... other cases
case CreateSuccessAction: 
  return {...state, article: action.payload} // <-- or whatever the shape of your state looks like.
// more other cases...

}

注意 :我不知道您使用的是哪個版本的ngrx,以及您是使用枚舉來處理狀態類型還是常量字符串。 但基本上,您可以在開關和案例中過濾操作類型(最新版本具有減少樣板的創建函數)。

Ngrx / Redux基本上是這樣的:動作由應用程序觸發,並由減速器捕獲。 reducer是一個純函數,可以不變地更新商店。 因為reducer不應該有副作用,所以效果模塊會處理日志,數據庫內容,文件i / o或JSON序列化/反序列化等內容。 因此,將您的JSON放入動作有效負載,調度它,並讓reducer執行狀態更新。

另外,作為旁注。 如果您不需要懸掛效果的可觀察對象,我認為使用switchMap而不是mergeMap更安全。 這樣,效果取消了所有訂閱,有利於新的observable。 避免可能的內存泄漏

在reducer中創建一個獲取對象(解析的JSON)的處理程序,然后您可以手動配置狀態屬性。 JSON.parse不會創建國家的新實例,你所要做的使用現狀以及對減速機設置的屬性是這樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM