2016-09-23 88 views
43

任何人都可以向我澄清如何使用.forRoot()調用構建多個嵌套的要素模塊層次結構?如何在要素模塊層次結構中使用.forRoot()

例如,如果我有這樣的模塊:

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

所有功能模塊有.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 
    }; 
    } 
} 

我可以創建另一個類爲根的使用則forRoot內設置()FeatureModuleA的功能:

@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 { } 

但我怎麼能 「轉移」 .forRoot()內,這就要求特殊的 ModuleClass?

當我看到我需要直接導入所有的子模塊到我的根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

因爲我知道這個由官方角色團隊維護的回購。所以他們只需在特殊的MaterialRootModule模塊中導入所有的.forRoot()調用即可解決上述問題。我真的不明白它將如何應用於我自己的根模塊? .forRoot真的意味着什麼?這是相對於包而不是實際的Web項目?

+0

我不知道你爲什麼要創建和使用'forRoot'方法..也許這有助於:https://angular.io/docs/ts/latest/guide/ngmodule.html – mxii

+1

是的。我閱讀了官方文檔。沒有任何關於如何用多個嵌套模塊來構建複雜項目。我想創建並使用forRoot,因爲提供者單例在整個項目中只應該安裝一次。 – ggabor

+0

好的,因爲在你的例子中沒有提供者。 :) – mxii

回答

79

通常forRoot用於添加應用程序/單件服務。

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

的理由是,如果你在@NgModule添加AuthServiceproviders,有可能爲一個以上的,如果你導入SharedModule到另一個模塊中創建。

我並不十分清楚在將SharedModule導入到急切加載的模塊中時是否會創建服務,但所提及的文檔與延遲加載模塊有關的解釋。當你懶洋洋地加載一個模塊時,所有的提供者都會被創建。

出於這個原因,我們添加了(按照約定)forRoot方法,以表明該方法只應稱爲根(應用)模塊,而對於其他模塊它應該只是正常的進口

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

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

感謝您的努力,但這仍然不關心多級嵌套模塊的情況。在您的示例中,您將AuthService導入了SharedModule。你可以重新引導你的例子,導入SharedModule(模塊,而不是服務!) - 並嘗試在某處使用AuthModule.forRoot()。 (免責聲明:對於我來說,AuthService/AuthModule只是一個例子 - 它可以是任何帶有forChild和forRoot方法的模塊。) – ggabor

+3

forRoot只能用於應用程序模塊。應該不需要轉發任何東西。當您在沒有forRoot的情況下導入Just SharedModule時,永不會調用forRoot。我們應該這樣構造我們的模塊。 forRoot中的應用程序範圍服務以及NgModule中的所有其他服務。嵌套與否,這是您應該考慮的方法 –

+0

如果您需要將功能模塊導入其他功能模塊,請繼續操作,但不會受到影響。請記住關於forRoot中關於應用程序級別提供程序的經驗法則,並且您應該很好 –