使用forRoot()导入模块

17

我正在学习 Angular2 Material 的示例,我发现所有的Material模块都使用 forRoot() 方法在根模块中导入。因此,在我的应用程序中,我也这样做。

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

非常感谢您的任何帮助。

1个回答

48

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,原因如上所述。你应该只是exportsMD模块。只有当在SharedModule中声明了某些需要MD模块的组件时,才需要使用imports。例如,如果您有一个使用MD按钮的组件,并且该组件是您在SharedModule中声明的共享组件。在这种情况下,您应该使用importsexports。但如果没有这样的组件,您只需要使用exports。这将向您将SharedModule导入的任何模块提供MD模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接