Ошибка довольно очевидна. Если вы делаете providedIn: 'root'
, то ваша служба регистрируется на RootInjector. И, следовательно, он в основном доступен для использования во всем приложении без необходимости вручную добавлять его в массив providers
каждого модуля, в котором вы хотите использовать эту службу.
Но теперь, когда вы удалили providedIn: 'root'
из декоратора @Injectable
, он будет доступен только тем модулям, для которых вы добавляете его в массив providers
этих модулей. Или это будет доступно для модулей, которые импортируют модули, для которых служба добавлена в массив providers
.
Вот Sample StackBlitz , чтобы помочь вам лучше понять это.
Просто чтобы описать:
- У меня там 3 модуля:
AppModule
, NewModule
и NotImportedModule
.
- Я буду использовать службы, записанные в
NewModule
и NotImportedModule
в AppModule
AppComponent
.
NewModule
* SampleService
добавляется в массив provides
NewModule
, а NewModule
добавляется в массив imports
AppModule
. И именно поэтому я могу использовать SampleService
в AppComponent
.
NotImportedModule
не добавляется в массив imports
AppModule
, но AnotherService
равен providedIn: 'root'
. Следовательно, я могу использовать его в AppModule
.
Это означало бы, что AnotherService
будет доступно для использования во всем приложении, поскольку оно зарегистрировано на RootInjector, поскольку мы использовали providedIn: 'root'
на нем.
Но поскольку SampleService
НЕ был providedIn: 'root'
, но был добавлен в массив providers
NewModule
, чтобы использовать его в AppModule
, нам пришлось добавить NewModule
в массив imports
AppModule
.
Надеюсь, в этом примере будет больше смысла.