Я не разбираюсь в Angular-разработке. Одна вещь, которую я узнал о декораторе @Injectable(), это то, что он означает -
и не
Я не могу сразу сослаться на какой-то конкретный источник (плохая память, старение), но это были статьи в Интернете и, возможно, какие-то учебные пособия. Я, кстати, говорю о пустом @Injectable(), а не о том, у которого есть свойство providedIn.
В любом случае, похоже, что повествование документации Angular соответствует более позднему смыслу. Здесь написано, что целью декоратора является
а еще вот что -
@Injectable() указывает, что Angular может использовать этот класс в системе внедрения зависимостей.Так:
@Injectable()?@Injectable() заключается в том, что «этот класс можно внедрить как зависимость», то почему я могу использовать класс обслуживания без декоратора @Injectable() в качестве зависимости, и он по-прежнему работает нормально?




Класс представляет собой зависимость, которую можно внедрить, но учтите, что без свойства providedIn сервис необходимо добавить в массив поставщиков, чтобы он был виден для внедрения зависимостей!
Я бы хотел, чтобы это произошло: вы можете использовать класс только как const someClass = new SomeClass() или вы можете создавать статические методы и получать к ним доступ, например SomeClass.someMethod, где метод будет определен как static someMethod() {...}, поэтому класс невозможно использовать при внедрении зависимостей, потому что @Injectable() сообщает angular framework, что класс является сервисом, то же самое касается @Component или @Directive, именно так вы регистрируете компоненты angular и используете их, иначе это класс javascript и ничего больше!
Разница между простым классом JS и сервисами angular заключается в том, что
Когда вы создаете класс типа const someClass = new SomeClass(), он создает новый экземпляр, поэтому экземпляр будет иметь собственный набор свойств и методов, которые не будут видны другим экземплярам.
Когда вы объявляете службу в DI, синглтон будет доступен текущему элементу/модулю, который имеет службу в массиве поставщиков, и всем дочерним элементам будет предоставлен общий доступ к одному и тому же экземпляру. ProvidedIn означает, что во всем приложении используется один экземпляр!
@atiyar, технически вы возитесь с внутренними компонентами angular и, вероятно, делаете то же самое, что и инъекционный, хотя не уверен, рекомендуется ли это делать
технически пустой декоратор @Injectable() отмечает класс, который будет обработан компилятором Angular. он анализирует параметры в конструкторе и создает для этого правильную фабрику. например класс:
// no @Injectable()
class MyService {
constructor(http: HttpClient) {}
}
не может быть предоставлен в массиве поставщиков простым способом providers: [MyService], поскольку Angular не знает, что предоставить в конструкторе.
кроме внедрения в конструктор, он на самом деле ничего не делает. Я просто говорю разработчикам, что этот класс следует использовать в DI.
Создайте простой класс обслуживания с помощью
export class SomeService{ }без декоратора @Injectable(), а затем добавьте его в качестве параметра Ctor какого-либо компонента. Вам это не подходит?! Конечно, вам нужно добавить массивprovidersмодуля/компонента.