Angular ngrx-store:如何在模块之间共享存储(主模块/功能模块)

时间:2017-10-31 06:51:41

标签: angular typescript ngrx-store-4.0

我有两个角度模块:功能

主/根模块:

@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. 这被认为是一种好习惯吗?
  3. 目前我无法做到这一点,因为主feature中没有AppState州:

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

    由于主要商店this.store.select('feature')没有feature键,因此打字稿表示错误AppState

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

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

    我在主AppComponent中遇到错误:

      

    TypeError:无法读取属性&#39; someValue&#39;未定义的

3 个答案:

答案 0 :(得分:4)

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

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

现在,正如所说的那样,延迟加载商店的主要想法是您在主商店中没有功能商店密钥,但是在应用程序生命周期中,它们会在需要时添加。因此,您可以做的是将功能缩减器导入到您需要的主模块组件中,并直接从功能缩减器中进行选择。 但同样,这是一个问题,如果这是一个人想要做的事情。我不会。

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

答案 1 :(得分:0)

我的解决方案:

  • 提取了名为 core 的额外功能模块。我已将其他模块所需的所有共享全局/状态重构为 core
  • core 上使用共享状态添加了所有模块的依赖关系(没有循环依赖关系)
  • 使用核心模块中的选择器,打印机没有问题,表明商店中没有这样的密钥

答案 2 :(得分:0)

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

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

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

    但是

  • 核心模块的
  • Reducer只看到coreState。

  • 惰性模块的归约器(使用ActionReducerMap定义)仅看到其自己的subState。 在大多数情况下,它很干净,但有时应在coreState条件下处理操作。 没问题,coreState始终在商店中。

  • 在延迟模块中定义的
  • Metareducers仅看到其自己的lazyModuleState。 处理子状态之间的互连仍然很有用,但它们对coreState-lazyModuleSate关系没有帮助。

  • 仅在应用程序级别定义的全局元还原器可以看到coreState。 尽管很丑陋,但可以在这里进行操作。