我正在浏览Angular2 Material的例子,我看到所有的Material模块都是使用forRoot()
方法导入到根模块中的。在我的应用中,我也是这么做的
现在我需要在其他共享模块中使用一些Material组件,这意味着我需要在我的共享模块中导入相关的Material包。我不清楚是否需要使用forRoot()
方法,同时在共享模块中导入它们。
提前感谢您的帮助
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模块中。因此,在你的应用模块中声明的所有组件都可以访问该模块中的所有内容。
但是declarations
中的所有内容(包括组件、指令和管道)都不会被任何子模块继承。因此,我们仍然需要将该模块导入到我们需要它的任何其他模块中。
你的问题似乎是专门关于你的ShareModule
。对于这个模块,您不应该使用forRoot
,原因如上所述。您应该只exports
的MD模块(s)。只有在SharedModule
中声明的某些组件实际上需要任何MD模块时才使用imports
。例如,如果您有一个使用MD按钮的组件,并且该组件是您在SharedModule
中声明的共享组件。在本例中,您应该使用imports
和exports
。但是如果没有这样的组件,你只需要exports
。这将为您导入SharedModule
的任何模块提供MD模块。