У библиотечной службы Angular всегда есть новый экземпляр

В Угловом 17 Существует библиотека Angular с именем CommonLib, и она содержит WaitSpinnerService, которая имеет переменную частного класса waitSpinner = new EventEmitter();

Я использую CommonLib WaitSpinnerService в AppComponent, поэтому мне нужно импортировать его в AppModule. Я подчеркиваю, что WaitSpinnerService предоставляется в: 'root'.

В конструкторе appComponent я слушаю WaitSpinnerService waitSpinner.asObservable через подписку, чтобы включить или выключить счетчик ожидания.

У меня много лениво загружаемых модулей. Как это возможно, что когда я переходил к лениво загружаемому модулю, всегда создавая новый WaitSpinnerService, который я вижу, когда я переходил к лениво загружаемому модулю, всегда приводил к выполнению конструктора WaitSpinnerService.

Подробнее об иерархии модулей: AppModule

ОбщийМодуль

  • ModuleAAA (быстро загружается) импорт CommonLib, импорт SharedModule
  • ModuleBBB (быстро загружен) импортировать CommonLib, импортировать SharedModule
  • ModuleCCC (отложенная загрузка) импорт CommonLib, импорт SharedModule
  • ModuleDDD (отложенная загрузка) импорт CommonLib, импорт SharedModule

В каждом месте использовался CommonLibModule.forRoot(). Какова будет правильная организация модуля, чтобы WaitSpinnerService оставался одноэлементным в приложении?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
3
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если ваша служба предоставляется в корневом каталоге, при импорте библиотечного модуля эта служба автоматически добавляется в корень вашего приложения. Поэтому нет необходимости добавлять его в массив поставщиков модуля приложения.


Проверьте, добавила ли служба spinner в ваши лениво загружаемые модули массив поставщиков компонента/модуля. Это вызывает инициализацию новой службы.


Также попробуйте проверить, импортирован ли ваш общий модуль в модули с отложенной загрузкой, с помощью forRoot или для дочернего элемента, это добавит поставщиков на уровне модуля с отложенной загрузкой.

Мой «общий модуль» — это мой библиотечный модуль из моей библиотеки angular, поэтому мне нужно импортировать его в ленивый загруженный модуль. Если я хорошо понимаю, мне не нужно добавлять службу счетчика в массив провайдера, потому что он может создать новый экземпляр службы. Я прав?

L. Kvri 04.08.2024 10:04

@L.Kvri да, это создание нового экземпляра

Naren Murali 04.08.2024 10:12

@L.Kvri, проблема решена?

Naren Murali 05.08.2024 14:23
Ответ принят как подходящий

вы можете использовать этот шаблон

@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'.

L. Kvri 04.08.2024 20:51

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

Веб-API ASP.NET Core 8: невозможно зарегистрировать службу с ограниченной областью из синглтона
Задача выполнена успешно, никогда не вызывалась
Добавьте несколько синглтонов одного и того же класса обслуживания во внедрение зависимостей в .NET 8
Связь по именованному каналу Windows между службой Windows C# .NET и клиентом C++ зависает
Команда `sudo systemctl start mybig_app` удерживается, и служба находится в состоянии загрузки (активации), никогда не переходя в активное состояние
Подключитесь к серверу DataSnap из службы Android
Является ли служба переднего плана единственным вариантом запуска одного метода?
После установки targetSdk = 34 активность в фоновом режиме не может получать обновления от службы переднего плана
Автономный компонент Angular (с использованием LoadComponent) — служба отложенной загрузки не работает
Программа запускается нормально при запуске вручную, но автоматически завершается сбоем через службу systemd