2016-09-23 113 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的任何模块。