Angular 延迟加载功能模块,在减速器初始化之前触发ngrx动作

Angular 延迟加载功能模块,在减速器初始化之前触发ngrx动作,angular,ngrx,ngrx-store,Angular,Ngrx,Ngrx Store,我面临以下问题。我的操作在我的减速器初始化之前被触发。由于这个原因,我的减速机没有采取行动。在我的减速机初始化之前,我的减速机启动时,我如何影响它 此图显示了redux流 我的操作是从ConfigurationEffect发送的。并且应该由不同的XFeature减速器捕获这些减速器是基于特征的减速器 代码示例: 应用程序模块 @NgModule({ declarations: [AppComponent], imports: [ BrowserModule, Commo

我面临以下问题。我的操作在我的减速器初始化之前被触发。由于这个原因,我的减速机没有采取行动。在我的减速机初始化之前,我的减速机启动时,我如何影响它

此图显示了redux流

我的操作是从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))),
      ),
    ),
  );
X特征减速器

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:
 ...
})

我不确定这是否是您正在寻找的,但当注册减速器时,NgRx会发送一个
更新减速器
操作。您可以在效果中收听这些操作,以禁用
SaveConfig
操作

在NgRx 7之前,这看起来是:

{type: '@ngrx/store/update-reducers', feature: 'feature1'}
{type: '@ngrx/store/update-reducers', feature: 'feature2'}
{type: '@ngrx/store/update-reducers', features: ['feature1',
'feature2']}
从NgRx 7开始,如下所示:

{type: '@ngrx/store/update-reducers', feature: 'feature1'}
{type: '@ngrx/store/update-reducers', feature: 'feature2'}
{type: '@ngrx/store/update-reducers', features: ['feature1',
'feature2']}
我有这些台词。 即使调出这些行,此操作也会在延迟加载的模块加载之前执行

this.store.dispatch(new Action());
this.router.navigate(['/lazy']);
但过了一会儿,我发现它应该以这种方式工作,以等待惰性模块加载(这意味着注册所有特性,如减缩器、效果…)来执行操作

this.router.navigate(['/lazy'])
    .then(_ => {
        this.store.dispatch(new Action());
    });

你应该提供更多的细节。最重要的是,您的操作是从哪里发送的?通过代码示例进行了改进,嗯…这看起来不像整个画面。因此,延迟加载存储的通常设置是:您有
AppModule
,在其中使用
.forRoot(…)
注册主减速器和效果。然后,您就有了延迟加载的角度模块,例如,
MyLazyModule
,您可以在其中注册延迟加载的ngrx减速器/效果,与您在
AppModule
中注册延迟加载的ngrx减速器/效果的方式相同,不同之处在于您现在使用的是
.forFeature(…)
而不是
.forRoot(…)
。简而言之,从
AppModule
中删除
.forFeature(…)
注册,并将它们放入延迟加载的模块中。但是,在发送操作后,我的其他还原程序仍会加载。目前影响解决方案的唯一方法是在启动时加载所有减速器,我希望避免这种情况。应该有重放动作或其他什么其他的还原?很抱歉,我可能遗漏了一些东西,但我很难理解您的整个应用程序结构。特别是,您有哪些角度模块和相应的ngrx模块,以及在哪里触发哪些动作(哪个ngrx模块)并导致问题。如果你能澄清一点,这将是有益的。是的,每次顶级减速机的结构都会改变