Угловой синглтон сервис - PullRequest
0 голосов
/ 30 октября 2018

Насколько я понимаю, единственная разница между использованием providedIn: 'root' и добавлением вашего провайдера в массив providers модуля заключается в дрожании дерева. В настоящее время мое приложение работает нормально, если я добавляю providedIn: 'root', оно работает нормально, но если я удаляю это и добавляю его в массив провайдеров модуля, я получаю StaticInjectorError, говоря, что не могу найти провайдера. Кто-нибудь видел это или понимает, почему это произойдет? Из документов я считаю, что добавление его в массив провайдеров должно позволить этому работать

1 Ответ

0 голосов
/ 30 октября 2018

Ошибка довольно очевидна. Если вы делаете providedIn: 'root', то ваша служба регистрируется на RootInjector. И, следовательно, он в основном доступен для использования во всем приложении без необходимости вручную добавлять его в массив providers каждого модуля, в котором вы хотите использовать эту службу.

Но теперь, когда вы удалили providedIn: 'root' из декоратора @Injectable, он будет доступен только тем модулям, для которых вы добавляете его в массив providers этих модулей. Или это будет доступно для модулей, которые импортируют модули, для которых служба добавлена ​​в массив providers.

Вот Sample StackBlitz , чтобы помочь вам лучше понять это.

Просто чтобы описать:

  1. У меня там 3 модуля: AppModule, NewModule и NotImportedModule.
  2. Я буду использовать службы, записанные в NewModule и NotImportedModule в AppModule AppComponent.
  3. NewModule * SampleService добавляется в массив provides NewModule, а NewModule добавляется в массив imports AppModule. И именно поэтому я могу использовать SampleService в AppComponent.
  4. NotImportedModule не добавляется в массив imports AppModule, но AnotherService равен providedIn: 'root'. Следовательно, я могу использовать его в AppModule.

Это означало бы, что AnotherService будет доступно для использования во всем приложении, поскольку оно зарегистрировано на RootInjector, поскольку мы использовали providedIn: 'root' на нем.

Но поскольку SampleService НЕ был providedIn: 'root', но был добавлен в массив providers NewModule, чтобы использовать его в AppModule, нам пришлось добавить NewModule в массив imports AppModule.

Надеюсь, в этом примере будет больше смысла.

...