使用 forRoot() 导入模块

Importing modules with forRoot()

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

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

提前感谢您的帮助

forRoot 仅用于主应用模块。这是一种约定,因此只有应用程序模块才能获得 application/singleton 提供程序。这是为了避免为应用程序多次创建应该是单例的提供程序。例如

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.

因此,在应用程序模块中调用 forRoot 可以让您将该模块(通常是调用 forRoot 附带的提供程序)提供的所有内容都放入应用程序模块中。因此,在您的应用程序模块中声明的所有组件都可以访问该模块中的所有内容。

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

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