Angular2 - 减少者之间的共享行动是个坏主意吗?

时间:2016-06-23 06:59:50

标签: angular redux ngrx

我们在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)。

高级 - 没有锅炉板和控制订购指示灯开/关。 缺点 - 可能会增加复杂性和更多代码。

2 个答案:

答案 0 :(得分:2)

组织Redux存储的典型方法是通过每个键的某种域构建数据,并定义一个reducer函数,该函数被赋予代理负责维护对该片段状态的更新,通常由{{{ 1}}实用程序。 Redux绝对鼓励您使用多个子reducer函数来响应相同的传入操作,以便combineReducerssliceA根据需要单独更新。排序不应该是一个问题,因为每个子减速器通常不知道该状态的任何其他部分,并且仅涉及更新其自己的切片。有关相关信息,请参阅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中留下纯函数。