我有两个角度模块:主和功能:
主/根模块:
@NgModule({
imports: [
StoreModule.forRoot({router: routerReducer}),
EffectsModule.forRoot([...]),
...
],
declarations: [],
...
})
export class AppModule {}
功能模块:
@NgModule({
imports: [
StoreModule.forFeature('feature', {someValue: someValueReducer}),
EffectsModule.forFeature([...]),
...
],
declarations: [],
...
})
export class FeatureModule {}
我需要访问'功能'主模块中的数据片段,用于根据feature
模块中存储的数据有条件地显示/激活应用程序选项卡。
(换句话说,我需要一个可由所有模块 main 和任何功能模块访问的全局/共享状态。)
目前我无法做到这一点,因为主feature
中没有AppState
州:
export interface AppState {
router: RouterReducerState<RouterStateUrl>;
}
由于主要商店this.store.select('feature')
没有feature
键,因此打字稿表示错误AppState
。
使用selector
:this.store.select(selectFeatureValue)
我收到运行时错误:
export const selectFeatureModule = createFeatureSelector<FeatureState>('feature');
export const selectFeatureValue = createSelector(selectFeatureModule ,
(state: FeatureState) => state.someValue);
我在主AppComponent中遇到错误:
TypeError:无法读取属性&#39; someValue&#39;未定义的
答案 0 :(得分:4)
在我看来,这几乎违背了两者的目的:延迟加载的模块和延迟加载的商店。
您应该重新考虑您的设计。反之亦然,您需要在功能模块中使用主状态并且这很好,因为没有主功能模块就可以激活功能模块但反之亦然有点奇怪。
现在,正如所说的那样,延迟加载商店的主要想法是您在主商店中没有功能商店密钥,但是在应用程序生命周期中,它们会在需要时添加。因此,您可以做的是将功能缩减器导入到您需要的主模块组件中,并直接从功能缩减器中进行选择。 但同样,这是一个问题,如果这是一个人想要做的事情。我不会。
我会重新考虑我在主模块中需要的设计和东西,我将把它放入主减速器/商店。
答案 1 :(得分:0)
我的解决方案:
答案 2 :(得分:0)
我认为,这至少部分是一个有效的问题。想象一下以下结构:
appState
├── coreState
│
├── lazyModuleSate1
│ ├── subStateA
│ └── subStateB
│
└── lazyModuleSate2
├── subStateA
└── subStateB
coreState可能包含有关用户,会话的常见信息...
惰性模块的归约器在处理操作时可能需要访问这种公共状态。
但是
Reducer只看到coreState。
惰性模块的归约器(使用ActionReducerMap定义)仅看到其自己的subState。 在大多数情况下,它很干净,但有时应在coreState条件下处理操作。 没问题,coreState始终在商店中。
Metareducers仅看到其自己的lazyModuleState。 处理子状态之间的互连仍然很有用,但它们对coreState-lazyModuleSate关系没有帮助。
仅在应用程序级别定义的全局元还原器可以看到coreState。 尽管很丑陋,但可以在这里进行操作。