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