Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular NgRx:存储模块创建多个实例_Angular_Typescript_Ngrx - Fatal编程技术网

Angular NgRx:存储模块创建多个实例

Angular NgRx:存储模块创建多个实例,angular,typescript,ngrx,Angular,Typescript,Ngrx,我在使用ngRx时遇到了代码问题。由于这个项目是巨大的,它更多的是一个设计问题,很抱歉,我没有提供一个最小的和复制的例子 我有一个具有这种结构的项目: AppModule 主输出模块 侧导航组件 头部组件 利用组件模块[在批准中延迟加载] 映射组件 服务 ServicesModule[在AppModule中导入] HttpServicesModule 利用服务模块 开发服务 在此结构中,我将此模块添加到AppModule: @NgModule({ imports: [ StoreM

我在使用ngRx时遇到了代码问题。由于这个项目是巨大的,它更多的是一个设计问题,很抱歉,我没有提供一个最小的和复制的例子

我有一个具有这种结构的项目:

AppModule
主输出模块
侧导航组件
头部组件
利用组件模块[在批准中延迟加载]
映射组件
服务
ServicesModule[在AppModule中导入]
HttpServicesModule
利用服务模块
开发服务
在此结构中,我将此模块添加到
AppModule

@NgModule({
  imports: [
    StoreModule.forRoot(exploitationReducers),
  ]
})
export class ExploitationStoreModule { }
没有任何问题,我的所有代码都运行良好。但当我将其添加到
PrimaryOutletModule
剥削组件模块
剥削服务模块
,并将其从
AppModule
中删除时,它将停止工作

我希望将其从AppModule中删除,以避免创建全局可访问的存储(我希望为它们提供有意义的作用域)

我的第一个想法是记录
select
dispatch
事件,当我这样做时,我看到事件没有被捕获。将其添加到模块后:

constructor() { console.log('Store module instance created'); }
我看到两个例子。接下来,我意识到我必须使用
StoreModule
forRoot
方法

但是,由于我的
开发StoreModule
已经在使用它,我寻找解决方案并偶然发现,延迟加载的模块正在创建新的模块实例

如果我理解正确,我将使用
forRoot
两次,导致我的
漏洞存储模块的两个实例

由于我希望为我的模块提供正确的作用域,并且不允许它们访问与它们没有业务往来的存储(例如,
explotionmodule
不应该访问
SupervisionStore
),因此我不想被迫将我的所有存储模块导入我的
AppModule


这就产生了一个问题:如何在应用程序中声明存储,使它们不是全局的,并且只在各自的模块中提供?您可以在功能模块中使用
storeModule.forFeature
。 但是,当加载模块时,该状态将对整个应用程序可用

一些额外资源:


一个存储保存着应用程序的整个状态树,以下是您应该只有一个存储的最佳实践(在一些边缘情况下,性能可能是一个问题,您可能需要多个存储,我链接到redux文档,其中有一个很好的解释)


如果使用eg
store
将应用商店导入组件,typescript只知道
FooState
,但实际上应用商店保存整个应用程序的状态,例如
BarState


但就个人而言,我不需要访问组件中的存储,因为我使用的是选择器,而选择器实际上并不需要存储类型。例如,
this.store.select(selectEmployees)

,这意味着一旦加载了
开发
模块,如果我将
开发存储
添加到我的
监控组件
,它将有权访问它?这是否意味着您不能将存储范围限定为单个模块(应用程序模块除外)?无论如何,+1表示信息存储保存了应用程序的整个状态树,下面的最佳做法是您应该只有一个存储(在一些边缘情况下,性能可能会成为一个问题,您可能需要多个存储,我链接到redux文档,其中有一个很好的解释)。如果使用例如
store
将应用商店导入组件,typescript只知道
FooState
,但事实上,应用商店保存整个应用程序的状态,例如
BarState
。但我个人不需要访问组件中的商店,因为我使用的是选择器,这并不需要商店类型。例如
this.store.select(selectEmployees)
OK,那么最佳做法是一个商店,而不是几个?我知道组件只理解所提供的
状态
,但我想阻止开发人员导入与其所在模块无关的状态。看来这是不可能的,可怜虫。。。谢谢你提供的所有信息,非常有用!