2017-08-31 42 views
1

如何提供全球服务(例如提供数据)并以角度2+应用程序从子模块访问它?这里强调的是子模块。我知道使用组件层次结构树非常简单,但我无法找到任何解释如何与多个模块协同工作的解释。Angular 2+:为子模块提供全球服务的单一实例

例如,如果我们有如下的应用结构/层次:

AppModule 
    myservice 
    AppComponent 
    FeatureModule1 
    ComponentA 
    ComponentB 
    FeatureModule2 
    ComponentC 
    ComponentD 
    FeatureModule3 
     ComponentE 

我在哪里有提供服务?仅在AppModule或子模块中(FeatureModule1FeatureModule2FeatureModule3)?关于导入的相同问题。 要导入并仅在根级别提供不起作用(例如,FeatureModule1已无法访问提供的myservice实例) 我是否必须重新导入(最终重新提供)在每个层次上?

回答

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。

+0

感谢您的快速回复。为了理解,即使在FeatureModule2中已经导入SharedModule,也必须在FeatureModule3中导入SharedModule,这意味着模块导入不会传播到子模块吗? – phev8

+1

模块导入被传播到子模块。但是在你的子模块中再次导入 并不会造成伤害,所以你可以在将来改变你的结构,而不用害怕破坏事物;-) –