Angular singleton-сервис

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

Вам нужно предоставить код, а еще лучше пример stackblitz ...

miselking 30.10.2018 19:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Вот Образец StackBlitz, который поможет вам лучше понять это.

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

  1. У меня есть 3 модуля: AppModule, NewModule и NotImportedModule.
  2. Я буду использовать сервисы, написанные в NewModule и NotImportedModule в AppModuleAppComponent.
  3. NewModuleSampleService добавляется к массиву providesNewModule, а NewModule добавляется к массиву importsAppModule. Вот почему я могу использовать SampleService в AppComponent.
  4. NotImportedModule не добавлен в массив importsAppModule, но AnotherService - это providedIn: 'root'. Следовательно, я могу использовать его в AppModule.

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

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

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

Другие вопросы по теме