Угловой синглтон-сервис

Синглтон — это класс, который позволяет создать только один экземпляр самого себя и предоставляет доступ к этому созданному экземпляру. Он содержит статические переменные, которые могут содержать уникальные и частные экземпляры самого себя. Он используется в сценариях, когда пользователь хочет ограничить создание экземпляра класса только одним объектом.

Одноэлементная служба — это экземпляр службы, совместно используемый компонентами.

Предоставление одноэлементной службы

Есть два способа сделать службу одноэлементной в Angular:

  • Объявите root для значения свойства @Injectable () providedIn
  • Включите службу в AppModule или в модуль, который импортируется только AppModule

Использование providedIn

Начиная с Angular 6.0, предпочтительный способ создания одноэлементной службы — установить для providedIn значение root в декораторе службы @Injectable (). Это указывает Angular предоставить службу в корне приложения.

  import {Injectable} from '@ angular/core'; @ Injectable ({providedIn: 'root',})  класс экспорта UserService {}  

массив поставщиков NgModule

В приложениях, созданных с помощью версий Angular до 6.0, службы являются зарегистрированными массивами поставщиков NgModule следующим образом:

  @NgModule ({... Provider: [UserService], ...})  

Если бы этот NgModule был корневым AppModule, UserService был бы одноэлементным и доступным во всем приложении. Хотя вы можете видеть, что это закодировано таким образом, использование свойства providedIn декоратора @Injectable () в самой службе предпочтительнее, начиная с Angular 6.0, поскольку это делает ваши службы древовидными.

Шаблон forRoot ()

Как правило, вам понадобится только providedIn для предоставления услуг и forRoot ()/forChild () для маршрутизации. Однако понимание того, как forRoot () работает, чтобы убедиться, что служба является одноэлементной, будет информировать вашу разработку на более глубоком уровне.

Если модуль определяет и поставщиков, и объявления (компоненты, директивы, каналы), тогда загрузка модуля в несколько функциональных модулей приведет к дублированию регистрации службы. Это может привести к появлению нескольких экземпляров службы, и служба больше не будет вести себя как синглтон.

Есть несколько способов предотвратить это:

  • Используйте синтаксис providedIn вместо регистрации службы в модуле.
  • Разделите свои службы по отдельным модулям.
  • Определите методы forRoot () и forChild () в модуле .

Используйте forRoot () для отделения поставщиков от модуля, чтобы вы могли импортировать этот модуль в корневой модуль с поставщиками и дочерние модули без поставщиков.

  1. Создайте статический метод forRoot () в модуле.
  2. Поместите поставщиков в метод forRoot ().

Greeting.module. ts

  static forRoot (config: UserServiceConfig): ModuleWithProviders {return {ngModule: GreetingModule, providers: [{provide: UserServiceConfig, useValue: config}]};  }  

forRoot () и маршрутизатор

RouterModule предоставляет службу маршрутизатора, а также директивы маршрутизатора, такие как RouterOutlet и routerLink. Модуль корневого приложения импортирует RouterModule, чтобы у приложения был маршрутизатор, а компоненты корневого приложения могли получить доступ к директивам маршрутизатора. Любые функциональные модули также должны импортировать RouterModule, чтобы их компоненты могли помещать директивы маршрутизатора в свои шаблоны.

Если в RouterModule не было forRoot (), тогда каждый функциональный модуль создавал бы новый экземпляр Router, который может нарушить работу приложения, так как маршрутизатор может быть только один. Используя метод forRoot (), корневой модуль приложения импортирует RouterModule.forRoot (…) и получает маршрутизатор, а все функциональные модули импортируют RouterModule.forChild (…), который не создает экземпляр другого маршрутизатора.

Оцените статью
nanomode.ru
Добавить комментарий