angular - 使用 forRoot() 导入模块

标签 angular angular2-material

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

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

在此先感谢您的帮助

最佳答案

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 的提供程序)提供给应用程序模块。因此,在您的应用模块中声明的所有组件都可以访问该模块中的所有内容。

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

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

关于angular - 使用 forRoot() 导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39664861/

相关文章:

javascript - 分配给复选框更改的 bool 值上的 ngOnChanges 未捕获

仅当第一个可观察对象为空时, Angular rxjs 才订阅第二个可观察对象

javascript - 如何将进度圈限制在 60 而不是 100% 以内

html - 用于 Dart 的 Css Angular 2 Material 组件。我如何使字形居中?

angular - 找不到 Angular Material 核心主题

Angular 8 : Mark Form as Touched from Parent Component

angular - ionic 2 : Loop through list of objects

html - 更改屏幕大小时,文本和按钮会移位

Angular 2 Material - overlay 和 portal 是如何工作的?

通过组件代码进行Angular2 Material 控制