Angular2-RC5。
答案 0 :(得分:3)
模块需要具有相同的服务实例。要实现此目的,该服务只需位于您的bootsrap providers
的{{1}}。否则,如果在不同的提供程序中找到相同的服务,则可以运行并行实例。
所以问题就变成了:如何在顶级AppModule
中获取服务,但是将其从所有其他模块中排除?
通过自己编写的服务,这非常简单。
providers
的一部分,请将其放在该模块的AppModule
中,而不是其他地方providers
)中,请确保不将其放入DummyModule
DummyModule
或Angular注入器将为每个导入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()]
,则需要第三方开发人员进行上述更改。或者,您可以创建一个自定义模块来声明该模块的组件,管道和指令,而不是导入第三方模块,但是实现上面的更改以将该模块的服务放在@NgModule
方法中。
这就是我为获得第三方服务所做的工作 - forRoot()
(Angular Material模块的一部分) - 即使其模块尚未正确配置,也可作为单个实例工作。 See this github issue.