- 我们如何在 ngModules 之间使用ngrx共享状态?
- 我们如何在 ngModules 之间共享同一个服务实例?
角2-RC5。
模块需要具有相同的服务实例。为此,该服务只需要在providers
您的引导程序中AppModule
。否则,如果在不同的提供者中发现相同的服务,您可能正在运行并行实例。
所以问题就变成了:如何在顶层获取服务providers
,但将其排除在所有其他模块之外?
使用您自己编写的服务,这真的很简单。
AppModule
,请将其放在该模块中,providers
而不是其他任何地方DummyModule
如果该服务位于您要导入其他模块的另一个模块(我们称它为进口。相反,您希望通过静态方法公开该服务。DummyModule
providers
DummyModule
forRoot()
所以改变:
@NgModule({
providers: [ MyService]
})
export class DummyModule{ }
至:
@NgModule({
providers: [] //empty since we want a singleton service
})
export class DummyModule{
static forRoot() {
return {ngModule: DummyModule, providers: [ MyService ]};
}
}
现在当正规模块时imports: [DummyModule]
,他们不会得到MyService
。另一方面,在 中AppModule
,您有imports: [DummyModule.forRoot()]
which 公开了服务。结果,只有最顶层的组件才能获得服务,并且您将在所有模块之间共享它的单个实例。
使用 3rd 方服务,这并不简单。
基本上,如果它也使用@NgModule
. 或者,您可以创建一个自定义模块来声明该模块的组件、管道和指令,而不是导入第 3 方模块,但实现上述更改以将该模块的服务放入一个forRoot()
方法中。
这就是我为获得第 3 方服务MdIconService
(Angular Material 模块的一部分)所做的工作,即使它的模块尚未正确配置,它也可以作为单个实例工作。请参阅此 github 问题。