如何在ngModules之间共享服务和状态

时间:2016-08-27 14:06:33

标签: javascript angular ngrx

  1. 我们如何在ngModules之间使用 ngrx 分享州?
  2. 我们如何在ngModules之间共享相同的服务实例?
  3. Angular2-RC5。

1 个答案:

答案 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.