我正在学习 Angular2 Material 的示例,我发现所有的Material模块都使用 forRoot()
方法在根模块中导入。因此,在我的应用程序中,我也这样做。
现在,我需要在其他共享模块中使用一些Material组件,这意味着我需要在我的共享模块中导入相关的Material包。但我不确定是否需要同时在共享模块中使用 forRoot()
方法。
非常感谢您的任何帮助。
我正在学习 Angular2 Material 的示例,我发现所有的Material模块都使用 forRoot()
方法在根模块中导入。因此,在我的应用程序中,我也这样做。
现在,我需要在其他共享模块中使用一些Material组件,这意味着我需要在我的共享模块中导入相关的Material包。但我不确定是否需要同时在共享模块中使用 forRoot()
方法。
非常感谢您的任何帮助。
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
中声明的共享组件。在这种情况下,您应该使用imports
和exports
。但如果没有这样的组件,您只需要使用exports
。这将向您将SharedModule
导入的任何模块提供MD模块。