【发布时间】:2017-12-27 14:39:04
【问题描述】:
我试图为这种情况找到最佳实践,但我没有找到。
问题: 我不想重复操作文件,就像在我的示例中一样 home-todos.actions 和 sport-todos-actions,我想使用相同的 to-dos.action 文件。和相同的减速器。
示例: 例如,我编写了一个 todo 应用程序,在此示例中,如果我调度一个类型为 'ADD_TODO_ASYNC' 的动作,它将在 home(effects and reducer) 和 sport(effects and reducer) 中调度,您会看到问题
todos.actions.ts
const ADD_TODO_ASYNC = 'ADD TODO ASYNC';
const ADD_TODO_COMPLETE = 'ADD TODO COMPLETE';
const ADD_TODO_FAILD = 'AD TODO FAILD';
class addTodoComplete {
type = ADD_TODO_COMPLETE;
}
class addTodoFaild {
type = ADD_TODO_COMPLETE;
}
export type Actions = addTodoComplete | addTodoFaild;
sport.effects.ts
@Injectable()
export class SportTodosService {
@Effect() ADD_TODO_ASYNC$ = this.actions$.ofType(TodosActionTypes.ADD_TODO_ASYNC)
.map(toPayload)
.swithMap( (todo: Todo) => this.api.addTodo(todo))
.map((todo: Todo) => TodosActionTypes.addTodoComplete(todo))
constructor(
private actions$: Actions,
private api: api
) { }
}
home.effects.ts
export class HomeTodosService {
@Effect() ADD_TODO_ASYNC$ = this.actions$.ofType(TodosActionTypes.ADD_TODO_ASYNC)
...
constructor(
...
) { }
}
减速器
function todosReducer(state, action: TodosActionTypes.Actions) {
switch (action.type) {
case TodosActionTypes.ADD_TODO_COMPLETE:
return state;
default:
return state;
}
}
app.module.ts
@NgModule({
declarations: [
AppComponent
],
imports: [
StoreModule.forRoot({
sport: todosReducer,
home: todosReducer,
}),
EffectsModule.forRoot([
SportTodosService
HomeTodosService,
])
],
providers: [
api
],
bootstrap: [AppComponent]
})
export class AppModule { }
我试图了解这种情况的最佳做法是什么? 编写带有“HOME_ADD_TODO”和“SPORT_ADD_TODO”等上下文的操作?
还是有官方方式?
如果你知道解决方案,不管解决方案是针对 redux 还是 ngrx
谢谢大家
【问题讨论】:
标签: javascript angular typescript redux ngrx