我使用的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不能从字符串变成State类型。
更新:
查看注释中的链接后,我是否应该创建一个效果,该效果调用一个调用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)))
);
答案 0 :(得分:2)
您可以为减速器添加代码吗?您应该在效果中反序列化JSON字符串。然后,该效果应派出一个减速器捕获的动作。然后,reduce会更新状态(在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,以及您是否使用枚举来表示状态类型或const字符串。但基本上,您可以在开关和案例中过滤动作类型(最新版本具有创建者功能,可以减少样板)。
Ngrx / Redux基本上是这样的:动作由应用触发,并由化简器捕获。 reducer是一个纯函数,可以不变地更新存储。因为reducer不应该有副作用,所以effects模块可以处理日志记录,数据库内容,文件I / O ...或JSON序列化/反序列化。因此,将您的JSON放入操作负载中,进行调度,然后让reducer进行状态更新。
此外,作为旁注。如果不需要效果中的可观察对象,我认为使用switchMap而不是mergeMap更安全。这样,效果将取消所有订阅,而支持新的可观察者。避免可能的内存泄漏
答案 1 :(得分:0)
在减速器中创建一个获取对象(已解析的JSON)的处理程序,然后可以手动分配状态属性。 JSON.parse不会创建State的新实例,您必须使用当前状态并在化简器like this上设置属性。