我是ngrx
的新手,我试图为我的每个功能模块都提供一个状态,并为应用程序模块提供一个状态。首先,我注册了StoreModule
,它在app.module.ts
中的作用是这样的:
@NgModule({
declarations: [
...
],
imports: [
...,
StoreModule.forRoot({app: fromApp.reducer}),
EffectsModule.forRoot([AppEffectsService])
],
bootstrap: [AppComponent]
})
export class AppModule { }
然后我创建了一个名为home的模块,该模块带有reducer and Effects服务,并像这样使用它们:
@NgModule({
declarations: [
...
],
imports: [
...,
HomeRoutingModule,
StoreModule.forFeature(fromHome.homeFeatureKey, fromHome.reducer),
EffectsModule.forFeature([HomeEffectsService]),
]
})
export class HomeModule { }
我在家用减速器中放入了console.log
,每次执行一个动作时,我都会看到两次记录!我现在不知道为什么我的减速器每次调度都要调用两次。甚至当我将存储添加到更多模块时,我也会看到重复的日志。
Reducer看起来像这样:
const homeReducer = createReducer(
initialHomeState,
on(HomeActions.loadOrderTypesSuccess, (state, { orderTypes }) => ({ ...state, orderTypes })),
);
export function reducer(state: HomeState | undefined, action: Action) {
console.log(action.type);
return homeReducer(state, action);
}
这是我的效果:
loadOrderTypes$ = createEffect(() => this.actions$.pipe(
ofType(HomeActions.loadOrderTypes),
mergeMap(() => from(this.dataService.getOrderTypes())
.pipe(
map(orderTypes => HomeActions.loadOrderTypesSuccess({ orderTypes })),
catchError(error => of(HomeActions.loadOrderTypesFailure({ error }))),
)
)
));
动作的创建:
export const loadOrderTypes = createAction(
'[Home Page] Load order type start'
);
export const loadOrderTypesSuccess = createAction(
'[Home Page] Load order type success',
props<{ orderTypes: OrderType[] }>()
);
export const loadOrderTypesFailure = createAction(
'[Home Page] Load order type failure',
props<{ error: any }>()
);
分派操作后,日志为:
@ngrx/store/init
15:23:36.470 app.reducer.ts:22 @ngrx/effects/init
15:23:36.505 core.js:38781 Angular is running in the development mode. Call enableProdMode() to enable the production mode.
15:23:36.608 app.reducer.ts:22 @ngrx/store/update-reducers
15:23:36.609 home.reducer.ts:35 @ngrx/store/update-reducers
15:23:36.644 app.reducer.ts:22 [Home Page] Load order type start
15:23:36.644 home.reducer.ts:35 [Home Page] Load order type start
15:23:36.761 client:52 [WDS] Live Reloading enabled.
15:23:37.743 app.reducer.ts:22 [Home Page] Load order type success
15:23:37.744 home.reducer.ts:35 [Home Page] Load order type success
我希望我的减速器被调用一次。我在做什么错了?
答案 0 :(得分:0)
动作是分派给所有减速器的,这是设计使然。
我们不知道要调用哪个reducer,因为完全可以根据另一个模块的动作来修改状态。