使用forRoot()导入模块



我正在浏览Angular2 Material的例子,我看到所有的Material模块都是使用forRoot()方法导入到根模块中的。在我的应用中,我也是这么做的

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

提前感谢您的帮助

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

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

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

最新更新