我正在浏览example of Angular2 Material,我发现所有Material模块都是使用forRoot()
方法导入根模块的。所以在我的应用程序中我也这样做。
现在我需要在其他共享模块中使用一些Material组件,这意味着我需要在Shared模块中导入相关的Material包。我不清楚在共享模块中导入它们时是否还需要使用forRoot()
方法。
提前感谢您提供任何帮助
答案 0 :(得分:42)
forRoot
仅用于主app模块。这是一个使用的约定,只有app模块才能获得应用程序/单例提供程序。这是为了避免被认为是单身的提供者,为应用程序创建多次。例如
import { ModuleWithProviders } '@angular/core';
@NgModule({
declarations: [ SomeDirective ],
exports: [ SomeDirective ]
})
export class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [ AuthProvider ]
}
}
}
这里我们只应在导入到app模块时调用forRoot
,这样它才能创建AuthProvider
一次作为单身。需要SharedModule
的所有其他模块应该只导入ShareModule
,以便它可以使用SharedDirective
。
因此,在app模块中调用forRoot
可以获得该模块(通常是调用forRoot
附带的提供者)提供的所有内容到app模块中。因此,您的app模块中声明的所有组件都可以访问该模块中的所有内容。
但是declarations
(包括组件,指令和管道)中的所有内容都不会被任何子模块继承。因此,我们仍然需要将模块导入到我们需要的任何其他模块中。
您的问题似乎与您的ShareModule
有关。对于此模块,您不应使用forRoot
,原因如上所述。你应该只是exports
MD模块。如果imports
中声明的某个组件实际上需要任何MD模块,则只使用SharedModule
。例如,如果您有一个使用MD按钮的组件,并且该组件是您在SharedModule
中声明的共享组件。在这种情况下,您应该imports
和exports
。但如果没有这样的组件,您只需要exports
。这将MD模块提供给您导入SharedModule
的任何模块。