16

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

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

提前感谢您的帮助

4

1 回答 1

47

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

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,在 app 模块中调用会将该模块(以及通常伴随调用的提供者forRoot)提供的所有内容都放入 app 模块中。因此,您的应用程序模块中声明的所有组件都可以访问该模块中的所有内容。

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

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

于 2016-09-23T16:59:21.757 回答