我正在浏览 example of 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
的提供程序)提供给应用程序模块。因此,在您的应用模块中声明的所有组件都可以访问该模块中的所有内容。
但是声明
中的所有内容(包括组件、指令和管道)都不会被任何子模块继承。所以我们仍然需要将该模块导入到我们需要它的任何其他模块中。
您的问题似乎专门针对您的 ShareModule
。对于这个模块,您不应该使用 forRoot
,原因我在上面提到过。您应该只exports
MD 模块。只有在 SharedModule
中声明的某些组件实际上需要任何 MD 模块时,才使用 imports
。例如,如果您有一个使用 MD 按钮的组件,并且该组件是您在 SharedModule
中声明的共享组件。在这种情况下,您应该imports
和exports
。但是如果没有这样的组件,你只需要exports
。这会向您将 SharedModule
导入的任何模块提供 MD 模块。
关于angular - 使用 forRoot() 导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39664861/