При создании сервисов в Angular CLI он добавляет дополнительные метаданные с помощью свойства «предоставлено в» со значением по умолчанию «root» для декоратора Injectable.
@Injectable({
providedIn: 'root',
})
Что именно делает providedIn? Я предполагаю, что это делает службу доступной как одноэлементную службу «глобального» типа для всего приложения, однако было бы лучше объявить такие службы в массиве поставщиков AppModule?
ОБНОВИТЬ:
Для всех остальных следующий абзац также дает еще одно хорошее объяснение этого, в частности, если вы хотите предоставить свои услуги только функциональному модулю.
Теперь существует новый рекомендуемый способ регистрации провайдера непосредственно внутри
@Injectable()
декоратора с использованием новогоprovidedIn
атрибута. Он принимает'root'
в качестве значения любой модуль вашего приложения. Когда вы используете'root'
, вашinjectable
будет зарегистрирован как синглтон в приложении, и вам не нужно добавлять его к поставщикам корневого модуля. Точно так же, если вы используетеprovidedIn: UsersModule
, тоinjectable
регистрируется как поставщик модуля,UsersModule
не добавляя его вproviders
модуль. "- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /
ОБНОВЛЕНИЕ 2:
После дальнейшего расследования я решил, что полезно иметь providedIn: 'root'
Если вы хотите provide
использовать службу в любом модуле, кроме корневого, тогда вам лучше использовать providers
массив в декораторах функционального модуля, иначе вы столкнетесь с круговыми зависимостями. Здесь можно провести интересные обсуждения - https://github.com/angular/angular-cli/issues/10170
Ответы:
если вы используете providedIn, инъекционный объект регистрируется как поставщик модуля без добавления его к поставщикам модуля.
Из
Docs
источник
providedIn
атрибут, чтобы определить, где сервис должен быть инициализирован при использовании@Injectable()
декоратора. Затем вы должны удалить его из атрибута provider вашегоNgModule
объявления, а также из его оператора импорта. Это может помочь уменьшить размер пакета за счет удаления неиспользуемого кода из пакета.providedIn: 'root'
это самый простой и эффективный способ предоставления услуг, начиная с Angular 6:Для получения дополнительной информации прочтите документацию и ответы на часто задаваемые вопросы о NgModule.
Btw:
providers
вместо этого массив NgModule.источник
Из Документов
Помечает класс как доступный для Injector для создания.
Сама служба - это класс, созданный CLI и украшенный @Injectable ().
Определяет, какие инжекторы будут предоставлять инъекционный объект, либо связав его с @NgModule или другим InjectorType, либо указав, что этот инъекционный компонент должен быть предоставлен в «корневом» инжекторе, который будет инжектором уровня приложения в большинстве приложений.
Когда вы предоставляете сервис на корневом уровне, Angular создает единый общий экземпляр сервиса и внедряет его в любой класс, который его запрашивает. Регистрация поставщика в метаданных @Injectable () также позволяет Angular оптимизировать приложение, удаляя службу из скомпилированного приложения, если она не используется.
Также можно указать, что услуга должна предоставляться в конкретном @NgModule. Например, если вы не хотите, чтобы служба была доступна приложениям, если они не импортируют созданный вами модуль, вы можете указать, что служба должна быть предоставлена в модуле.
Этот метод является предпочтительным, потому что он включает встряхивание дерева (встряхивание дерева - это шаг в процессе сборки, который удаляет неиспользуемый код из базы кода ) службы, если его ничего не внедряет.
Если невозможно указать в службе, какой модуль должен ее предоставлять, вы также можете объявить поставщика службы внутри модуля:
источник
@Injectable()
?providedIn сообщает Angular, что корневой инжектор отвечает за создание экземпляра вашего сервиса. Услуги, предоставляемые таким образом, автоматически становятся доступными для всего приложения, и их не нужно указывать в каком-либо модуле.
Классы обслуживания могут действовать как собственные поставщики, поэтому их определение в декораторе @Injectable - это все, что вам нужно.
источник
По данным
Documentation
:источник