使用forRoot()导入模块

时间:2016-09-23 15:49:34

标签: angular angular2-material

我正在浏览example of Angular2 Material,我发现所有Material模块都是使用forRoot()方法导入根模块的。所以在我的应用程序中我也这样做。

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

提前感谢您提供任何帮助

1 个答案:

答案 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中声明的共享组件。在这种情况下,您应该importsexports。但如果没有这样的组件,您只需要exports。这将MD模块提供给您导入SharedModule的任何模块。

相关问题