Что на самом деле означает пустой декоратор @Injectable() в Angular?

Я не разбираюсь в Angular-разработке. Одна вещь, которую я узнал о декораторе @Injectable(), это то, что он означает -

  • этот класс может иметь/принимать внедренные зависимости

и не

  • этот класс можно внедрить как зависимость

Я не могу сразу сослаться на какой-то конкретный источник (плохая память, старение), но это были статьи в Интернете и, возможно, какие-то учебные пособия. Я, кстати, говорю о пустом @Injectable(), а не о том, у которого есть свойство providedIn.

В любом случае, похоже, что повествование документации Angular соответствует более позднему смыслу. Здесь написано, что целью декоратора является

  • чтобы показать, что класс можно внедрить.

а еще вот что -

  • Декоратор @Injectable() указывает, что Angular может использовать этот класс в системе внедрения зависимостей.

Так:

  1. Что именно на самом деле означает пустой декоратор @Injectable()?
  2. Если значение @Injectable() заключается в том, что «этот класс можно внедрить как зависимость», то почему я могу использовать класс обслуживания без декоратора @Injectable() в качестве зависимости, и он по-прежнему работает нормально?
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  • Что именно означает пустой декоратор @Injectable()?

Класс представляет собой зависимость, которую можно внедрить, но учтите, что без свойства providedIn сервис необходимо добавить в массив поставщиков, чтобы он был виден для внедрения зависимостей!

  • Если значение @Injectable() заключается в том, что «этот класс можно внедрить как зависимость», то почему я могу использовать класс обслуживания без декоратора @Injectable() в качестве зависимости, и он по-прежнему работает нормально?

Я бы хотел, чтобы это произошло: вы можете использовать класс только как const someClass = new SomeClass() или вы можете создавать статические методы и получать к ним доступ, например SomeClass.someMethod, где метод будет определен как static someMethod() {...}, поэтому класс невозможно использовать при внедрении зависимостей, потому что @Injectable() сообщает angular framework, что класс является сервисом, то же самое касается @Component или @Directive, именно так вы регистрируете компоненты angular и используете их, иначе это класс javascript и ничего больше!

Разница между простым классом JS и сервисами angular заключается в том, что

Когда вы создаете класс типа const someClass = new SomeClass(), он создает новый экземпляр, поэтому экземпляр будет иметь собственный набор свойств и методов, которые не будут видны другим экземплярам.

Когда вы объявляете службу в DI, синглтон будет доступен текущему элементу/модулю, который имеет службу в массиве поставщиков, и всем дочерним элементам будет предоставлен общий доступ к одному и тому же экземпляру. ProvidedIn означает, что во всем приложении используется один экземпляр!

Создайте простой класс обслуживания с помощью export class SomeService{ } без декоратора @Injectable(), а затем добавьте его в качестве параметра Ctor какого-либо компонента. Вам это не подходит?! Конечно, вам нужно добавить массив providers модуля/компонента.

atiyar 16.05.2024 21:12

@atiyar, технически вы возитесь с внутренними компонентами angular и, вероятно, делаете то же самое, что и инъекционный, хотя не уверен, рекомендуется ли это делать

Naren Murali 16.05.2024 22:28
Ответ принят как подходящий

технически пустой декоратор @Injectable() отмечает класс, который будет обработан компилятором Angular. он анализирует параметры в конструкторе и создает для этого правильную фабрику. например класс:

// no @Injectable()
class MyService {
  constructor(http: HttpClient) {}
}

не может быть предоставлен в массиве поставщиков простым способом providers: [MyService], поскольку Angular не знает, что предоставить в конструкторе.

кроме внедрения в конструктор, он на самом деле ничего не делает. Я просто говорю разработчикам, что этот класс следует использовать в DI.

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