Angular 2+:为子模块提供单个全局服务实例

时间:2017-08-31 08:08:08

标签: angular

如何在角度2+应用中提供全局服务(例如提供数据)并从子模块访问它?这里强调的是子模块。我知道它很简单,有一个组件层次结构树,但我找不到任何好的解释如何使用多个模块。

例如,如果我们有以下app结构/层次结构:

AppModule
  myservice
  AppComponent
  FeatureModule1
     ComponentA
     ComponentB
  FeatureModule2
     ComponentC
     ComponentD
     FeatureModule3
       ComponentE

我必须在哪里提供服务?只是在AppModule或在子模块中FeatureModule1FeatureModule2FeatureModule3)?关于进口的同样问题。 仅在根级别导入和提供功能不起作用(例如FeatureModule1无法访问所提供的myservice实例,直到我经历过。) 我是否必须在每个层次结构级别上重新导入(最终重新提供)?

1 个答案:

答案 0 :(得分:2)

您必须在定义服务的模块中实现forRoot(),或在AppModule中定义它。不要在多个模块中提供服务,因为这将创建多个实例。我首选的方法是创建一个SharedModule,它提供所有这样的共享服务:

@NgModule({
  imports: [ ... ]
})
export class SharedModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [
        MyService
      ]
    };
  }
}

在我的AppModule中,我使用forRoot()导入它:

@NgModule({
  declarations: [ ... ],
  imports: [
    ...
    SharedModule.forRoot()
  ],
  providers: [ ... ],
  bootstrap: [AppComponent]
})
export class AppModule { }

在所有其他模块中,我只需要在没有foorRoot的情况下导入它。