В Угловом 17 Существует библиотека Angular с именем CommonLib, и она содержит WaitSpinnerService, которая имеет переменную частного класса waitSpinner = new EventEmitter();
Я использую CommonLib WaitSpinnerService в AppComponent, поэтому мне нужно импортировать его в AppModule. Я подчеркиваю, что WaitSpinnerService предоставляется в: 'root'.
В конструкторе appComponent я слушаю WaitSpinnerService waitSpinner.asObservable через подписку, чтобы включить или выключить счетчик ожидания.
У меня много лениво загружаемых модулей. Как это возможно, что когда я переходил к лениво загружаемому модулю, всегда создавая новый WaitSpinnerService, который я вижу, когда я переходил к лениво загружаемому модулю, всегда приводил к выполнению конструктора WaitSpinnerService.
Подробнее об иерархии модулей: AppModule
ОбщийМодуль
В каждом месте использовался CommonLibModule.forRoot(). Какова будет правильная организация модуля, чтобы WaitSpinnerService оставался одноэлементным в приложении?
Если ваша служба предоставляется в корневом каталоге, при импорте библиотечного модуля эта служба автоматически добавляется в корень вашего приложения. Поэтому нет необходимости добавлять его в массив поставщиков модуля приложения.
Проверьте, добавила ли служба spinner в ваши лениво загружаемые модули массив поставщиков компонента/модуля. Это вызывает инициализацию новой службы.
Также попробуйте проверить, импортирован ли ваш общий модуль в модули с отложенной загрузкой, с помощью forRoot или для дочернего элемента, это добавит поставщиков на уровне модуля с отложенной загрузкой.
@L.Kvri да, это создание нового экземпляра
@L.Kvri, проблема решена?
вы можете использовать этот шаблон
@NgModule({
providers: [WaitSpinnerService]
})
export class CommonLibModule {
static forRoot(): ModuleWithProviders<CommonLibModule> {
return {
ngModule: CommonLibModule,
providers: [WaitSpinnerService]
};
}
}
а затем импортируйте, как показано ниже
@NgModule({
imports: [
CommonLibModule.forRoot()
],
...
})
export class AppModule {}
Мое приложение содержит нетерпеливые и ленивые загружаемые модули. Я импортирую CommonLibModule в AppModule, потому что я использую счетчик ожидания в AppComponent, я слушаю, он изменяется или не отображается или не отображается счетчик ожидания. А как насчет других модулей? В настоящее время я импортирую CommonLibModule все остальные модули, независимо от того, загружаются ли они лениво или с нетерпением. Но я вообще не предоставляю никаких модулей в приложении WaitSpinnerService. Поскольку я вижу, что на основе WaitSpinnerServion будет создано больше экземпляров, вдохновленных тем фактом, что я использую ProvidedInű: 'root'.
Мой «общий модуль» — это мой библиотечный модуль из моей библиотеки angular, поэтому мне нужно импортировать его в ленивый загруженный модуль. Если я хорошо понимаю, мне не нужно добавлять службу счетчика в массив провайдера, потому что он может создать новый экземпляр службы. Я прав?