Я новичок в ngrx
, и я пытаюсь получить состояние для каждого из моих функциональных модулей, а также состояние для модуля приложения. Во-первых, я зарегистрировал StoreModule
и его эффекты в app.module.ts
, например:
@NgModule({
declarations: [
...
],
imports: [
...,
StoreModule.forRoot({app: fromApp.reducer}),
EffectsModule.forRoot([AppEffectsService])
],
bootstrap: [AppComponent]
})
export class AppModule { }
Затем я создал модуль под названием home с сервисом редукторов и эффектов и использовал их следующим образом:
@NgModule({
declarations: [
...
],
imports: [
...,
HomeRoutingModule,
StoreModule.forFeature(fromHome.homeFeatureKey, fromHome.reducer),
EffectsModule.forFeature([HomeEffectsService]),
]
})
export class HomeModule { }
Я положил console.log
в свой домашний редуктор и видел, что каждый раз, когда я отправляю действие, я вижу журнал дважды за действие! Я не знаю, почему мой редуктор вызывается дважды за отправку. И даже когда я добавляю хранилище для большего количества модулей, я вижу больше повторяющихся логов.
Редуктор выглядит так:
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
Я хочу, чтобы мой редуктор был вызван один раз. Что я делаю не так?