Какова цель Предоставлено Индексируемым декоратором при создании Сервисов в Угловом 6?
При генерации сервисов в Angular CLI он добавляет дополнительные метаданные со свойством "предоставлено в" со значением по умолчанию "root" для Injectable декоратора.
@Injectable({
providedIn: 'root',
})
Что именно предусмотрено в? Я предполагаю, что это делает сервис доступным, как одноэлементный сервис "глобального" типа для всего приложения, однако, не будет ли проще объявить такие сервисы в массиве провайдеров AppModule?
ОБНОВИТЬ:
Для кого-то еще следующий абзац предоставил еще одно хорошее объяснение этого, в частности, если вы хотите предоставлять свои услуги только функциональному модулю.
Существует теперь новый, рекомендуется способ регистрации поставщика, непосредственно внутри @Injectable()
декоратора, используя новый providedIn
атрибут. Он принимает 'root'
в качестве значения или любой модуль вашего приложения. Когда вы используете 'root'
, ваш injectable
будет зарегистрирован как одноэлементный в приложении, и вам не нужно добавлять его к поставщикам корневого модуля. Точно так же, если вы используете providedIn: UsersModule
, injectable
регистрируется как поставщик UsersModule
без добавления его к providers
модуля. "- https://blog.ninja-squad.com/2018/05/04/what -is-новый-угловой-6/
ОБНОВЛЕНИЕ 2:
После дальнейшего изучения я решил, что полезно providedIn: 'root'
Если вы хотите provide
услугу в любом модуле, отличном от корневого, то лучше использовать массив providers
в декораторах функциональных модулей, в противном случае вы будете страдать от циклических зависимостей. Интересные обсуждения, которые будут проведены здесь - https://github.com/angular/angular-cli/issues/10170
Ответы
Ответ 1
если вы используете providedIn, инъекция регистрируется как поставщик модуля, не добавляя его поставщикам модуля.
Из Docs
Сама услуга - это класс, созданный CLI, и украшенный функцией @Injectable. По умолчанию этот декоратор настроен с свойством enableIn, который создает поставщика для этой услуги. В этом случае предоставленоIn: "root" указывает, что служба должна быть предоставлена в корневом инжекторе.
Ответ 2
providedIn: 'root'
- самый простой и эффективный способ предоставления услуг, начиная с Angular 6:
- Служба будет доступна для всего приложения в виде отдельного файла, без необходимости добавлять его в массив поставщиков модулей (например, Angular <= 5).
- Если служба используется только в загруженном модуле, она будет загружена этим модулем.
- Если он никогда не используется, он не будет содержаться в сборке (дерево потрясено).
Для получения дополнительной информации подумайте о прочтении документации и часто задаваемых вопросов по NgModule.
Btw:
- Если вы не хотите использовать одноэлементное приложение для всего приложения, используйте вместо него массив поставщика.
- Если вы хотите ограничить область действия, чтобы никакой другой разработчик никогда не использовал вашу службу за пределами определенного модуля, вместо этого используйте массив провайдеров NgModule.
Ответ 3
providedIn сообщает Angular, что корневой инжектор отвечает за создание экземпляра вашей службы. Услуги, предоставляемые таким образом, автоматически становятся доступными для всего приложения и не нуждаются в перечислении в каком-либо модуле.
Сервисные классы могут выступать в роли их собственных поставщиков, поэтому их определение в @Injectable decorator - это все, что вам нужно.
Ответ 4
Согласно Documentation
:
Регистрация провайдера в метаданных @Injectable() также позволяет Angular оптимизировать приложение, удалив службу из скомпилированного приложения, если оно не используется.
Ответ 5
Из документов
Что такое инъекционный декоратор?
Помечает класс как доступный для Injector для создания.
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class UserService {
}
Сам сервис - это класс, сгенерированный CLI и декорированный с помощью @Injectable().
Что именно предусмотрено в?
Определяет, какие инжекторы будут предоставлять инъекцию, либо связывая ее с @NgModule или другим InjectorType, либо указав, что эта инъекция должна быть предоставлена в инжекторе "root", который будет инжектором уровня приложения в большинстве приложений.
providedIn: Type<any> | 'root' | null
условии в: "корень"
Когда вы предоставляете сервис на корневом уровне, Angular создает один общий экземпляр сервиса и внедряет его в любой класс, который его запрашивает. Регистрация провайдера в метаданных @Injectable() также позволяет Angular оптимизировать приложение, удаляя службу из скомпилированного приложения, если оно не используется.
В наличии: Модуль
Также возможно указать, что услуга должна предоставляться в определенном модуле @NgModule. Например, если вы не хотите, чтобы служба была доступна приложениям, если они не импортируют созданный вами модуль, вы можете указать, что служба должна предоставляться в модуле.
import { Injectable } from '@angular/core';
import { UserModule } from './user.module';
@Injectable({
providedIn: UserModule,
})
export class UserService {
}
Этот метод предпочтителен, потому что он позволяет трясти службу в дереве, если ее не внедряет ничего.
Если в сервисе невозможно указать, какой модуль должен предоставлять его, вы также можете объявить провайдера для сервиса в модуле:
import { NgModule } from '@angular/core';
import { UserService } from './user.service';
@NgModule({
providers: [UserService],
})
export class UserModule {
}