1

我们在 Angular 2 应用程序中使用 ngrx / store。我们的 store 是由 Reducers 组合而成的"cameraReducer", "subjectReducer"……我们希望维护一些全局和通用(跨不同功能)项目,例如"appReducer".

{type:LOADING_*, payload}在这样的场景中,共享一个像between individualReducersand之类的动作有意义appReducer吗?这应该在一个功能(可以被认为是一个单一的数据操作[使用单个 Reducer 和单个操作] 或多个相关数据操作 [使用多个 reducer 和多个操作])启动和关闭时打开一旦完成。appReducer 可能如下所示:

case LOADING_CAMERA:
     LOADING_SUBJECT:
            return state.setIn('loading') = true;

Adv - 没有样板。缺点 - 减速器的顺序将在指示器何时打开/关闭方面发挥作用。

或者

case LOADING:
        return state.setIn('loading') = true;

我们可以在调用每个功能的开头/结尾处编写代码

 this.store.dispatch({action:'LOADING', payload: true}); 
 //functionality
 this.store.dispatch({action:'LOADING', payload: false}); 

Adv - 指示器弹出/关闭的受控顺序。缺点 - 用于打开/关闭加载的样板代码。

或者

我们可以尝试将“loading”计算为组合的 observables(每个 reducer 都有自己的本地“loading”属性和该属性的 Observable)。

Adv - No Boilerplate 和 Controlled Order on 指示器开/关。缺点 - 增加的复杂性和更多的代码可能是。

4

2 回答 2

2

组织 Redux 存储的典型方法是通过每个键的某种域来构造数据,并定义一个 reducer 函数,该函数被委派负责维护该状态片的更新,通常由combineReducers实用程序组成。sliceARedux 绝对鼓励您使用多个 sub-reducer 函数来响应相同的传入操作,以便根据sliceB需要独立更新。排序不应该是一个问题,因为每个 sub-reducer 通常不知道状态的任何其他部分,只关心更新自己的切片。有关一些相关信息,请参阅 Redux 常见问题解答中的此答案:http ://redux.js.org/docs/FAQ.html#reducers-share-state 。

于 2016-06-23T16:26:06.450 回答
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。似乎任何具有副作用的不纯函数都以这种方式工作得最好,在 reducer 中只留下纯函数。

于 2016-06-23T18:08:26.043 回答