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