使用forRoot()导入模块

Pic*_*cci 14 angular2-material angular

我将通过Angular2 Material示例,我看到所有Material模块都是使用该forRoot()方法在根模块中导入的.所以在我的应用程序中我也这样做.

现在我需要在其他Shared模块中使用一些Material组件,这意味着我需要在Shared模块中导入相关的Material包.我不清楚forRoot()在共享模块中导入它们时是否还需要使用该方法.

在此先感谢您的帮助

Pau*_*tha 44

forRoot仅用于主app模块.这是一个使用的约定,只有app模块才能获得应用程序/单例提供程序.这是为了避免被认为是单身的提供者,为应用程序创建多次.例如

import { ModuleWithProviders } '@angular/core';

@NgModule({
  declarations: [ SomeDirective ],
  exports: [ SomeDirective ]
})
export class SharedModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [ AuthProvider ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里我们只应该forRoot在导入到app模块时调用,这样它才能创建AuthProvider一次作为单例.所有其他需要的模块SharedModule应该只需导入,ShareModule以便它可以使用SharedDirective.

因此,调用forRootapp模块可以将该模块提供的所有内容(以及通常调用的提供程序forRoot)提供给app模块.因此,在您的应用模块中声明的所有组件都可以访问该模块中的所有内容.

但是declarations(包括组件,指令和管道)中的所有内容都不会被任何子模块继承.所以我们仍然需要将模块导入到我们需要的任何其他模块中.

你的问题似乎是关于你的ShareModule.对于这个模块,你不应该使用forRoot,因为我上面提到的原因.你应该只是exportsMD模块.只有imports在声明的某个组件SharedModule实际需要任何MD模块时才使用.例如,如果您有一个使用MD按钮的组件,并且该组件是您在其中声明的共享组件SharedModule.在这种情况下你应该importsexports.但如果没有这样的组件,你只需要exports.这为您导入的任何模块提供了MD模块SharedModule.