如何在延迟加载的ngModule中通过shared.module加载服务,只是实例化了一次forRoot()

时间:2016-12-20 00:39:18

标签: angular angular2-services ng2-translate

如何通过SharedModule将服务作为延迟加载的ngModule中的单例加载?

如何在延迟加载的ngModule中将服务作为单例加载?

我有一个SharedModule,提供多种服务,如i18n和API。这些服务是自己的ngModules,它们提供了自己的forRoot功能。现在我想从带有forRoot的花边加载模块中的SharedModule加载服务,这样就不会通过依赖注入创建新实例。

我尝试了以下内容,但似乎没有任何效果

shared.module.ts

import {I18nModule} from "./i18n/i18n.module";
import {ApiModule} from "./api/api.module";

@NgModule({
  exports: [
    I18nModule,
    ApiModule
  ]
}
export class SharedModule {
  static forRoot():ModuleWithProviders {{
    return {
      ngModule: SharedModule,
      providers: [ ... I18nModule.forRoot().providers, ... ApiModule.forRoot().providers ]
    };
  }
}

app.module.ts

@NgModule({
    declarations: [AppComponent],
    imports: [
        BrowserModule,
        routing,
        SharedModule.forRoot(),
    ],
    providers: [
    ],
    bootstrap: [AppComponent]
})
export class AppModule {
}

进入模块和forRoot / for child的goor资源是http://blog.angular-university.io/angular2-ngmodule/

2 个答案:

答案 0 :(得分:0)

像问题一样链接根源。只需确保在根app.module中使用SharedModule.forRoot()加载SharedModule,并且不要在其他任何地方实例化服务。 Angular沿着ngModules向下移动直到根模块。

import {I18nModule} from "./i18n/i18n.module";
import {ApiModule} from "./api/api.module";

@NgModule({
  exports: [
    I18nModule,
    ApiModule
  ]
}
export class SharedModule {
  static forRoot():ModuleWithProviders {{
    return {
      ngModule: SharedModule,
      providers: [ ... I18nModule.forRoot().providers, ... ApiModule.forRoot().providers ]
    };
  }
}

答案 1 :(得分:0)

继续,然后在该服务的可插入装饰器中添加providerIn:'root'。

在以下情况下将加载服务:使用该服务的任何模块都将加载。 并且该服务将具有一个实例。

重要提示:请勿将其添加到输入模块(主要是app.module.ts)的导入中。如果您在此处添加它,它将在应用程序的第一次加载时加载。