11

我有两个角度模块:mainfeature

主/根模块:

@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和任何功能模块都可以访问的全局/共享状态。)

  1. 有可能这样做吗?
  2. 它被认为是好的做法吗?

目前我不能这样做,因为featuremain 中没有状态AppState

export interface AppState {
    router: RouterReducerState<RouterStateUrl>;
}

并且 typescript 指示错误this.store.select('feature'),因为没有featuremain store 的键AppState

使用selectorthis.store.select(selectFeatureValue)我收到运行时错误:

export const selectFeatureModule = createFeatureSelector<FeatureState>('feature');
export const selectFeatureValue = createSelector(selectFeatureModule ,
(state: FeatureState) => state.someValue);

我在主 AppComponent 中遇到错误:

TypeError:无法读取未定义的属性“someValue”

4

3 回答 3

9

我认为,这至少部分是一个有效的问题。想象以下结构:

appState
├── coreState
│
├── lazyModuleSate1
│   ├── subStateA
│   └── subStateB
│
└── lazyModuleSate2
    ├── subStateA
    └── subStateB
  • coreState 可能保存有关用户、会话...的常见信息

  • 惰性模块的减速器在处理动作时可能需要访问这种公共状态。

  • 核心模块的减速器只能看到 coreState。

  • 惰性模块的减速器(使用 ActionReducerMap 定义)只能看到它们自己的子状态。在大多数情况下它是干净整洁的,但有时,动作应该在 coreState 的条件下处理。没有问题,coreState 总是在商店里。

  • 在惰性模块中定义的元减速器只能看到它们自己的惰性模块状态。处理子状态之间的互连仍然很有用,但它们对 coreState -lazyModuleSate 关系没有帮助。

  • 只有在应用级别定义的全局元减速器才能看到 coreState。可以在这里处理动作,尽管非常难看。

于 2018-12-22T03:15:33.253 回答
8

在我看来,这几乎违背了两者的目的:延迟加载模块和延迟加载存储。

您可能应该重新考虑您的设计。通常反之亦然,您需要功能模块中的主状态,这很好,因为没有主状态您不能激活功能模块,但反之亦然有点奇怪。

现在,话虽如此,延迟加载存储的主要思想是您的主存储中没有功能存储键,但它们会在应用程序生命周期内根据需要添加。所以,你可以做的就是将你的特性缩减器导入到你需要的主模块组件中,然后直接从特性缩减器中选择。但同样,这是一个人想要做的事情,这是一个问题。我不会。

我会重新考虑我在主模块中需要的设计和东西,我将把它放入主减速器/存储中。

于 2017-10-31T07:20:26.797 回答
5

我的解决方案:

  • 提取了名为core的额外功能模块。我已将其他模块所需的所有共享全局/状态重构为core
  • 在核心上使用共享状态添加了所有模块的依赖项(无循环依赖项)
  • 使用来自核心模块的选择器,打字稿没有问题,表明存储中没有这样的键
于 2018-01-17T16:13:28.337 回答