如何在要素模块层次结构中使用.forRoot()

任何人都可以请澄清我怎么应用.forRoot()调用结构多个嵌套的function模块层次结构?

例如,如果我有这样的模块:

- MainModule - SharedModule - FeatureModuleA - FeatureModuleA1 - FeatureModuleA2 - FeatureModuleB 

所有function模块都有一个.forRoot()静态函数。

我应该如何定义FeatureModuleA以“传递”.forRoot()函数?

 @NgModule({ imports: [ //- I can use .forRoot() calls here but this module not the root module //- I don't need to import sub-modules here, FeatureA only a wrapper //FeatureModuleA1.forRoot(), //WRONG! //FeatureModuleA2.forRoot(), //WRONG! ], exports: [ //I cannot use .forRoot() calls here FeatureModuleA1, FeatureModuleA2 ] }) class FeatureModuleA { static forRoot(): ModuleWithProviders { return { //At this point I can set any other class than FeatureModuleA for root //So lets create a FeatureRootModuleA class: see below! ngModule: FeatureModuleA //should be: FeatureRootModuleA }; } } 

我可以为根用法创build另一个类,然后在FeatureModuleA的forRoot()函数中设置它:

 @NgModule({ imports: [ //Still don't need any sub module within this feature module ] exports: [ //Still cannot use .forRoot() calls but still need to export them for root module too: FeatureModuleA1, FeatureModuleA2 ] }) class FeatureRootModuleA { } 

但是如何在这个特殊的ModuleClass中“转移”.forRoot()调用呢?

正如我所看到的,我需要将所有子模块直接导入到我的根MainModule中,并为每个模块调用.forRoot():

 @NgModule({ imports: [ FeatureModuleA1.forRoot(), FeatureModuleA2.forRoot(), FeatureModuleA.forRoot(), SharedModule.forRoot() ] }) class MainModule { } 

我对吗? 在你回答之前,请看看这个文件: https : //github.com/angular/material2/blob/master/src/lib/module.ts

正如我所知道的这个由官方angular色团队维护的回购。 所以他们只需要在一个特殊的MaterialRootModule模块中导入所有的.forRoot()调用来解决上述问题。 我真的不知道如何将它应用于我自己的根模块? root.forRoot在这里意味着什么? 这是相对于包而不是实际的Web项目?

通常forRoot用于添加应用程序/单例服务。

 @NgModule({ providers: [ /* DONT ADD HERE */ ] }) class SharedModule { static forRoot() { return { ngModule: SharedModule, providers: [ AuthService ] } } } 

原因是,如果将AuthService添加到AuthService中的providers中,那么如果将SharedModule导入到其他模块中,则可能会创build多个SharedModule

我并不是100%清楚在将SharedModule导入到一个急切加载的模块中时是否创build服务,但是提到的文档是关于延迟加载的模块的解释。 当你懒洋洋地加载一个模块时,所有的提供者都会被创build。

出于这个原因,我们添加一个(通过约定) forRoot方法来表示该方法只应该被称为根(app)模块,而其他模块应该被正确地导入

 @NgModule({ imports: [SharedModule] }) class FeatureModule {} @NgModule({ imports: [SharedModule.forRoot()] }) class AppModule {}