Angular 延迟加载功能模块,在减速器初始化之前触发ngrx动作
我面临以下问题。我的操作在我的减速器初始化之前被触发。由于这个原因,我的减速机没有采取行动。在我的减速机初始化之前,我的减速机启动时,我如何影响它 此图显示了redux流 我的操作是从ConfigurationEffect发送的。并且应该由不同的XFeature减速器捕获这些减速器是基于特征的减速器 代码示例: 应用程序模块Angular 延迟加载功能模块,在减速器初始化之前触发ngrx动作,angular,ngrx,ngrx-store,Angular,Ngrx,Ngrx Store,我面临以下问题。我的操作在我的减速器初始化之前被触发。由于这个原因,我的减速机没有采取行动。在我的减速机初始化之前,我的减速机启动时,我如何影响它 此图显示了redux流 我的操作是从ConfigurationEffect发送的。并且应该由不同的XFeature减速器捕获这些减速器是基于特征的减速器 代码示例: 应用程序模块 @NgModule({ declarations: [AppComponent], imports: [ BrowserModule, Commo
@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模块)并导致问题。如果你能澄清一点,这将是有益的。是的,每次顶级减速机的结构都会改变