Функциональные модули с отложенной загрузкой, действие ngrx запускается перед инициализацией редуктора - PullRequest
0 голосов
/ 08 ноября 2018

Я столкнулся со следующей проблемой. Мое действие запускается до инициализации моего редуктора. По этой причине мой редуктор не подхватывает действие. Как я могу повлиять на то, что мой редуктор выполняет действия при запуске до инициализации моего редуктора?

На этом изображении показан поток притока.

enter image description here

Мое действие отправляется из ConfigurationEffect. И должны быть захвачены различными XFeature-редукторами, эти редукторы являются редукторами на основе функций

Пример кода:

модуль приложения

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    CommonModule,
    AppRoutingModule,
    HttpClientModule,
    StoreModule.forFeature('config', fromConfig.reducer),
    EffectsModule.forFeature([ConfigEffects]),
    EffectsModule.forRoot([AppEffects]),
    StoreModule.forRoot(reducers, { metaReducers }), 
    StoreDevtoolsModule.instrument({
      maxAge: 10,
      name: 'Debug DevTools',
      logOnly: true,
      actionSanitizer,
      stateSanitizer,
    }), 
  ], 
  bootstrap: [AppComponent],
})
export class AppModule {}

эффекты конфигурации

@Effect()
  loadConfigs$ = this.actions$.pipe(
    ofType(configActions.ConfigActionTypes.LoadConfigs),
    switchMap((action: configActions.LoadConfigs) =>
      this.configService.loadConfig().pipe(
        map((result: ConfigResponse) => new configActions.SaveConfigs(result)),
        catchError((err: HttpErrorResponse) => of(new configActions.FailConfigs(err.message))),
      ),
    ),
  );

xFeature Редуктор

export function reducer(state = initialState, action: XFeatureActions | ConfigActions): XFeatureState {
  switch (action.type) {
    // save configs, this will be called when the device is initially loaded.
    case ConfigActionTypes.SaveConfigs:
 ...
})

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

У меня были эти строки. это действие выполняется до загрузки лениво загруженного модуля, даже если поменять местами эти строки.

this.store.dispatch(new Action());
this.router.navigate(['/lazy']);

, но чуть позже я понял, что он должен работать таким образом, чтобы ждать отложенной загрузки модуля (это означает, что нужно зарегистрировать все функции, такие как редукторы, эффекты ...) для выполнения действия.

this.router.navigate(['/lazy'])
    .then(_ => {
        this.store.dispatch(new Action());
    });
0 голосов
/ 08 ноября 2018

Я не уверен, что это то, что вы ищете, но при регистрации редуктора NgRx отправляет действие update-reducers. Вы можете прослушать эти действия внутри своего эффекта, чтобы отключить действие SaveConfig.

Pre NgRx 7 это выглядит так:

{type: '@ngrx/store/update-reducers', feature: 'feature1'}
{type: '@ngrx/store/update-reducers', feature: 'feature2'}

Начиная с NgRx 7 это выглядит так:

{type: '@ngrx/store/update-reducers', features: ['feature1',
'feature2']}
...