0

我正在开发一个带有 angular 和 ngrx 的 nx monorepo。我创建了一个具有自己状态管理的库,我想在同一个应用程序的多个模块中重用它。

库结构

fooLib
  - foo.reducer.ts
  - foo.actions.ts
  - foo.selectors.ts
  - foo.service.ts // kind of facade
  - foo.feature.key.ts
  - index.ts

食品模块

@NgModule({
  imports: [
    CommonModule,
    StoreModule.forFeature(FOO_FEATURE_KEY, fooReducer)
    ...
  ],
})
export class FooModule {}

FooState 选择器

export const selectFooState = createFeatureSelector<State>( FOO_FEATURE_KEY );
export const someSelector = () => 
   createSelector(selectFooState, (state) => state.someValue)

很好,我将 FooModule 导入到我的主应用程序中,它按预期工作:我可以看到FOO_FEATURE_KEY在全局商店中注册,我可以通过调度/选择foo.service.ts(就像一个门面,将所有状态复杂性隐藏在某些方法后面)。

现在,我的主要应用程序是按模块组织的(具有自己的状态),其中一些还需要 FooModule。此外,这些模块中的每一个都应该有自己独特且独立的 FooState。

问题StoreModule.forFeature(FOO_FEATURE_KEY, fooReducer)无论在哪个模块声明它,都将使用相同的键。

作为第一次尝试,我尝试将 FooState 嵌套在每个 AppState 中。例子:

interface FirstAppState {
  loading: boolean;
  value: string;
  foo: FooState;
}

问题:选择器现在失败,因为FOO_FEATURE_KEY不再在 Root 上注册。

如何将所有逻辑(包括状态)保存在库中并将其包含在同一应用程序的多个模块中?我试图FOO_FEATURE_KEY通过注入/提供程序进行自定义,以便每个模块都可以使用自己的键/名称,但我无法在选择器中访问它,因为它们不是 Angular 的一部分,而只是纯函数/常量。

为了让事情变得更复杂,我还需要将每个状态与 localStorage 同步(我目前正在使用localStorageSynclib)。不是主要问题,但请记住...

谢谢!

编辑:正如评论描述中所建议的,没有正确描述我的问题。更清楚地说:FooState 处理并执行相当复杂的数据结构的操作。这种结构被同一个应用程序的多个模块使用:暴露的 api 完全相同,但运行时数据不同。我可以在每个模块中复制/粘贴这些 lib 文件,但我最终会得到大量相同的文件,并且维护起来将是一场噩梦......

4

0 回答 0