Как загрузить сервис через shared.module в лениво загруженном ngModule, который создается только один раз, хотя forRoot()

Как я могу загрузить сервис через SharedModule как синглтон в лениво загруженном ngModule?

Как я могу загрузить сервис как одиночный в лениво загруженном ngModule?

У меня есть SharedModule, который предоставляет несколько сервисов, таких как i18n и API. Сервисы являются собственными модулями ng, которые предоставляют свои собственные функции forRoot. Теперь я хотел бы загрузить Сервисы из SharedModule внутри загруженного модуля с помощью forRoot, чтобы новый экземпляр не создавался путем внедрения зависимостей.

Я пробовал что-то вроде следующего, но ничего не работает

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 {
}

Ресурс goor для входа в модули и forRoot / for child - это http://blog.angular-university.io/angular2-ngmodule/

1 ответ

Цепочка корней как в вопросах работает. Просто убедитесь, что вы загружаете SharedModule с SharedModule.forRoot() в корневой app.module и не создаете экземпляры сервисов где-либо еще. 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 ]
    };
  }
}

Идите вперед и добавьте providedIn: 'root' во инъекционный декоратор этой службы.

Сервис будет загружен, когда: Любой из модулей, который использует сервис, загружается. И у сервиса будет единственный экземпляр.

Важно: не добавляйте его в импорт модуля ввода (в основном app.module.ts). Если вы добавите его туда, он загрузится при первой загрузке приложения.

Другие вопросы по тегам