angular - 如何修改不在减速器中的 NGRX 存储?
问题描述
在代码中我有类似的东西:
this.store.dispatch(new LoadGame(id));
此操作由@Effect
和 火灾之一处理new LoadGameSuccess(game)
。比这个游戏被传递给reducer来更新GameState
。但是,如何更改GameState
以反映当前正在加载的游戏?再做一个动作并在减速器中处理它看起来不是很好。应用程序变成了“行动地狱”......我应该在@Effect
吗?
解决方案
不要试图违背设计模式。之所以这样设计是有原因的。
如果你有一个基于其他逻辑可能会或可能不会影响存储状态的操作,那么正确的方法是监听该操作,执行逻辑,然后调度一个新操作。
话虽这么说 - 你没有理由不能同时处理LoadGame
商店和效果中的动作。像这样的东西:
你的效果
@Effect()
loadGame$ = this.actions$.pipe(
ofType<LoadGame>(GameActions.LoadGame),
mergeMap(url => this.http.get<Game>("http://wherever.you.get.your.game.data.from")
.pipe(
game => [new LoadGameSuccess(game), new AnyOtherActionsHere()]
)
)
);
你的减速机
export function reducer(state = initialState, action: GameActions): State {
switch (action.type) {
case GameActions.LoadGame:
return {
...state,
isGameLoading: true,
};
case GameActions.LoadGameSuccess:
const { game } = action.payload
return {
...state,
game
isGameLoading: false,
};
}
}
请注意,这样做无需担心竞争条件。
推荐阅读
- python - 查找字符串中出现频率最高的单词并检查字符串是否仅包含 [az][AZ] 字符
- flutter - Flutter 中列表视图构建器的快照长度 [已修复]
- javascript - 使用 luxon 方法 fromFormat 无法按预期工作
- spring-boot - 证书在一台计算机上有效,但在另一台计算机上无效
- pandas - 将一列的选定值替换为另一列的中值但具有条件
- python - 使用 nms 时出错,:“模块”对象不可调用
- html - SVG 占用了额外的空间,并且边距不适用于文本元素
- django - 在 django 模型查询中按顺序排列的原始 SQL
- css - 如何垂直对齐高度取决于兄弟的容器?
- awk - 过滤来自两个文件的列匹配