2

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

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

我确实有一个提供 i18n 和 API 等服务的 SharedModule。这些服务是自己的 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 的好资源是http://blog.angular-university.io/angular2-ngmodule/

4

2 回答 2

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 ]
    };
  }
}
于 2016-12-20T22:46:08.313 回答
0

继续并在该服务的可注入装饰器中添加 providedIn: 'root'。

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

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

于 2020-02-09T09:31:29.643 回答