Javascript 如何在NGM模块之间共享服务和状态 我们如何在ngrx模块之间使用ngrx共享状态 我们如何在NGM模块之间共享相同的服务实例
Angular2-RC5。模块需要具有相同的服务实例。要实现这一点,该服务需要仅位于bootsrapJavascript 如何在NGM模块之间共享服务和状态 我们如何在ngrx模块之间使用ngrx共享状态 我们如何在NGM模块之间共享相同的服务实例,javascript,angular,ngrx,Javascript,Angular,Ngrx,Angular2-RC5。模块需要具有相同的服务实例。要实现这一点,该服务需要仅位于bootsrapAppModule的providers中。否则,如果在不同的提供程序中找到相同的服务,则可能正在运行并行实例 因此问题变成了:如何在顶级提供者中获得服务,但将其从所有其他模块中排除 通过您自己编写的服务,它非常简单 如果该服务是AppModule的一部分,则将其放入该模块的提供程序中,而不是其他任何地方 如果该服务位于您要导入到其他模块的另一个模块中(我们称之为DummyModule),请确保不
AppModule
的providers
中。否则,如果在不同的提供程序中找到相同的服务,则可能正在运行并行实例
因此问题变成了:如何在顶级提供者中获得服务,但将其从所有其他模块中排除
通过您自己编写的服务,它非常简单
- 如果该服务是
AppModule
的一部分,则将其放入该模块的提供程序中,而不是其他任何地方
- 如果该服务位于您要导入到其他模块的另一个模块中(我们称之为
DummyModule
),请确保不要将其放入DummyModule
的提供程序中,否则角度注入器将为导入DummyModule
的每个延迟加载模块创建一个并行实例。相反,您希望从forRoot()静态方法公开该服务李>
因此,改变:
@NgModule({
providers: [ MyService]
})
export class DummyModule{ }
致:
现在,当常规模块导入:[DummyModule]
时,它们将无法获得MyService
。另一方面,在AppModule
中,您有导入:[DummyModule.forRoot()]
,它公开了服务。因此,只有最顶层的组件才能获得该服务,并且您将在所有模块之间共享该服务的一个实例
使用第三方服务,这并不简单
基本上,如果第三方开发人员也在使用@NgModule
,则需要第三方开发人员进行上述更改。或者,您可以创建一个自定义模块来声明该模块的组件、管道和指令,而不是导入第三方模块,但要实现上面的更改,将该模块的服务放入forRoot()
方法中
这就是我为获得第三方服务--mdiservice
(棱角材料模块的一部分)--而做的,即使其模块尚未正确配置,也可以作为单个实例工作 你说的模块之间是什么意思?模块还是组件?正如他所说,他的意思是@NgModule
。这是一个有效的问题,我正试图弄清楚这一点,但我恐怕目前唯一的解决办法就是把所有东西都塞进根模块。我认为我们需要等待ngrx效果更新到RC5。@Filip Lauc感谢您的澄清。也许像ng2 redux这样的自由主义者能解决这个问题?他们可能会。但是我想我宁愿等待ngrx更新,然后一起切换到一个新的库。好的,我已经阅读了angular2网站上所有模块的信息,现在我了解了你写的内容和它非常好的解决方案。我不能接受这个答案,因为我仍然不明白如何共享在不同模块中声明的减缩器。(或者没有解决方案,我们只能在应用程序模块上做一次(太糟糕了))。谢谢仅需确认,大约一年后,这确实是ngrx 4提倡的方法。在其示例应用程序(平台repo的一部分)中,有一个类似上面的DummyModule的模块,称为AuthModule。看见
@NgModule({
providers: [] //empty since we want a singleton service
})
export class DummyModule{
static forRoot() {
return {ngModule: DummyModule, providers: [ MyService ]};
}
}