2016-09-23 136 views
9

我正在通過example of Angular2 Material,我發現使用forRoot()方法將所有材料模塊導入到根模塊中。所以在我的應用程序中,我也這樣做。使用forRoot()導入模塊()

現在我需要在其他Shared模塊中使用一些Material組件,這意味着我需要在Shared模塊中導入相關的Material包。我不清楚在共享模塊中導入它們時是否也需要使用forRoot()方法。

預先感謝任何幫助

回答

33

forRoot僅用於主要的應用程序模塊。這是一個慣例,以便只有應用程序模塊獲取應用程序/單例提供程序。這是爲了避免被認爲是單身人士的提供者,爲應用程序創建多次。例如

import { ModuleWithProviders } '@angular/core'; 

@NgModule({ 
    declarations: [ SomeDirective ], 
    exports: [ SomeDirective ] 
}) 
export class SharedModule { 
    static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: SharedModule, 
     providers: [ AuthProvider ] 
    } 
    } 
} 

在這裏,我們只能稱之爲forRoot在導入到應用程序模塊,以便它可以創建AuthProvider只有一次作爲一個單身。所有其他需要SharedModule的模塊應簡單地導入ShareModule,以便它可以使用SharedDirective

因此,在應用程序模塊中調用forRoot可以將該模塊提供的所有內容(傳統上與調用forRoot一起提供的提供程序)提供給應用程序模塊。因此,在您的應用程序模塊中聲明的所有組件都可以訪問該模塊中的所有內容。

但是declarations(包括組件,指令和管道)中的所有內容都不會被任何子模塊繼承。所以我們仍然需要將模塊導入到我們需要的任何其他模塊中。

您的問題似乎是專門針對您的ShareModule。對於這個模塊,您不應該使用forRoot,這是我上面提到的原因。您應該只需要exports MD模塊。如果在SharedModule中聲明的某個組件實際上需要任何MD模塊,則只能使用imports。例如,如果您有一個使用MD按鈕的組件,並且該組件是您在SharedModule中聲明的共享組件。在這種情況下,您應該使用importsexports。但是如果沒有這樣的組件,你只需要exports。這將MD模塊提供給您導入SharedModule的任何模塊。