3
  1. 我们如何在 ngModules 之间使用ngrx共享状态?
  2. 我们如何在 ngModules 之间共享同一个服务实例?

角2-RC5。

4

1 回答 1

5

模块需要具有相同的服务实例。为此,该服务只需要在providers您的引导程序中AppModule。否则,如果在不同的提供者中发现相同的服务,您可能正在运行并行实例。

所以问题就变成了:如何在顶层获取服务providers,但将其排除在所有其他模块之外?

使用您自己编写的服务,这真的很简单。

  • 如果服务是 的一部分AppModule,请将其放在该模块中,providers而不是其他任何地方
  • DummyModule如果该服务位于您要导入其他模块的另一个模块(我们称它为进口。相反,您希望通过静态方法公开该服务。DummyModuleprovidersDummyModuleforRoot()

所以改变:

@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 问题。

于 2016-08-27T15:47:17.477 回答