кодесурса
«Угловое

Angular Singleton Service

script1adsense2code
script1adsense3code

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

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

Предоставление единого сервиса

В Angular существует два способа сделать сервис одиночным:

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

Использование предоставлено

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

import { Injectable } from '@angular/core';
@Injectable({
  providedIn: 'root',
})
export class UserService {
}

Массив провайдеров NgModule

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

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

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

Шаблон forRoot ()

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

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

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

  • Используйте предоставленный синтаксис вместо регистрации службы в модуле.
  • Разделяйте свои сервисы на собственный модуль.
  • Определите методы 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 предоставляет сервис Router, а также директивы маршрутизатора, такие как RouterOutlet и routerLink. Модуль корневого приложения импортирует RouterModule, чтобы приложение имело Маршрутизатор, а компоненты корневого приложения могли получить доступ к директивам маршрутизатора. Любые функциональные модули также должны импортировать RouterModule, чтобы их компоненты могли помещать директивы маршрутизатора в свои шаблоны.

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

Предыдущий: Типы функциональных модулей
Далее: Провайдеры

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code