При генерации сервисов в 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