Вот мой модуль приложения:
@NgModule({
declarations: [
SampleA
],
imports: [
BrowserModule,
EffectsModule.forRoot([APIEffects]),
HttpClientModule,
StoreModule.forRoot(reducers),
StoreDevtoolsModule.instrument({
maxAge: 25, // Retains last 25 states
logOnly: environment.production, // Restrict extension to log-only mode
}),
KeyboardShortcutsModule.forRoot()
],
providers: [
APIService,
{
provide: HTTP_INTERCEPTORS,
useClass: HttpMockRequestInterceptor,
multi: true
}
],
bootstrap: [],
entryComponents: [
SampleComponent
]
})
export class AppModule{...}
Вот APIEffect
:
@Injectable()
export class APIEffects {
fetchData$ = createEffect(() => this.actions$.pipe(
ofType(Actions.apiFetchData),
mergeMap((action) => this.apiService.fetchData(...action)
.pipe(
map(data => Actions.apiSuccess({ data })),
catchError(() => of(Actions.apiCallFailed()))
)
)
));
}
Теперь, если я отправлю действие apiFetchData
в конструктор SampleComponent
, эффект не будет Не вызывать:
export class SampleComponent {
constructor(private store: Store<{ state: State }>) {
store.dispatch(Actions.apiFetchData(...))
}
}
Если я отправлю то же действие позже в жизненном цикле компонента, то все будет работать нормально, и эффект произойдет.
В Redux DevTools
я могу см. действие отправка происходит до effects init
. Вот порядок:
@ngrx/store/init
[API] fetch data // this is the fetch data action
@ngrx/effects/init
Поэтому мой вопрос заключается в том, как заставить эффекты инициализировать до создания моего компонента.
ОБНОВЛЕНИЕ
Я не решил проблему упоминалось выше, но сейчас я решил использовать ROOT_EFFECTS_INIT
(спасибо @mitschmidt за упоминание этого) и отправить серию действий после того, как effects
будет готов для инициализации состояния моего приложения. Вот эффект, который использует ROOT_EFFECTS_INIT
:
init$ = createEffect(() =>
this.actions$.pipe(
ofType(ROOT_EFFECTS_INIT),
map(action => CoverageUIActions.apiFetchData({...}))
)
);