我们在Angular 2应用程序中使用ngrx / store。我们的商店由Reducers "cameraReducer", "subjectReducer"
组合......我们希望保留一些全局和常见(跨差异功能)项目,例如" Loading Data" "appReducer"
中的属性。
在这样的情况下,在{type:LOADING_*, payload}
和individualReducers
之间共享appReducer
之类的操作是否有意义?这应该打开,同时启动和关闭一个功能(可以被认为是一个单一的数据操作[使用一个Reducer和一个动作]或多个相关的数据操作[使用多个Reducer和多个动作])一旦完成。 appReducer可能如下所示:
case LOADING_CAMERA:
LOADING_SUBJECT:
return state.setIn('loading') = true;
Adv - 没有Boilerplate。 缺点 - 减速器的排序将起到指示器何时弹出/关闭的作用。
或
case LOADING:
return state.setIn('loading') = true;
我们可以在调用每个功能的开头/结尾处使用代码
this.store.dispatch({action:'LOADING', payload: true});
//functionality
this.store.dispatch({action:'LOADING', payload: false});
高级 - 指示器弹出开启/关闭的受控排序。 缺点 - 打开/关闭加载的Boilerplate代码。
或者
我们可以尝试计算" loading"作为一个组合的observable(每个reducer都有自己的本地" loading"属性和一个Observable of the property)。
高级 - 没有锅炉板和控制订购指示灯开/关。 缺点 - 可能会增加复杂性和更多代码。
答案 0 :(得分:2)
组织Redux存储的典型方法是通过每个键的某种域构建数据,并定义一个reducer函数,该函数被赋予代理负责维护对该片段状态的更新,通常由{{{ 1}}实用程序。 Redux绝对鼓励您使用多个子reducer函数来响应相同的传入操作,以便combineReducers
和sliceA
根据需要单独更新。排序不应该是一个问题,因为每个子减速器通常不知道该状态的任何其他部分,并且仅涉及更新其自己的切片。有关相关信息,请参阅Redux常见问题解答中的此答案:http://redux.js.org/docs/FAQ.html#reducers-share-state。
答案 1 :(得分:0)
还可以选择使用效果。您可以订阅StateUpdates中的更改,只要状态发生更改,就会触发更改。我发现https://github.com/ngrx/example-app处的示例应用程序是有关如何构建应用程序和ngrx的重要信息来源。
例如,
@Effect() loadCollection$ = this.updates$
.whenAction(BookActions.LOAD_COLLECTION)
.switchMapTo(this.db.query('books').toArray())
.map((books: Book[]) => this.bookActions.loadCollectionSuccess(books));
当调度LOAD_COLLECTION时,会调用它来执行后台工作并调度更新组件的LOAD_COLLECTION_SUCCESS。看起来任何带有副作用的不纯函数都是这样做的最好,只在reducers中留下纯函数。