DI декораторы Angular

@Optional

Можно указать Angular, что зависимость необязательна, аннотируя параметр конструктора @Optional()

constructor(@Optional() private _logger: Logger) {
  if (this._logger) {
    this._logger.log(some_message);
  }
}

@Self

@Self говорит DI, чтобы искать зависимость только провайдерах своего компонента. Уместно использовать, если внутри компонета объявляется сервис с именем, которое уже присутствует в проекте.

@Component({
  providers: [], <=== искать тут, в данном случае не найдет и выкинет ошибку
})
export class HelloComponent {
  constructor(
    @Self() private _tyapk: TyapkService,
  ) {}
}

@SkipSelf

@SkipSelf говорит DI, чтобы искать зависимость исключая провайдеры текущего компонента.

@Component({
  providers: [TyapkService], <=== не искать тут, в данном случае не найдет и выкинет ошибку
})
export class HelloComponent {
  constructor(
    @SkipSelf() private _tyapk: TyapkService,
  ) {}
}

@Host

Почти как @Self. @Host сообщает DI искать зависимость в любом инжекторе, пока он не достигнет хоста. В большинстве случаев компонент и является хостом. Существует два распространенных случая, в которых хост-компонент отличается от текущего класса компонента:

  • Директива. Директива будет искать зависимость в компоненте, в котором она находится.
  • Проекция. Когда компонент находится внутри <ng-content></ng-content> другого компонента. Внутренний компонент будет искать зависимости во внешнем компоненте.

Похожие записи

@Attribute() декоратор

Аналогично @Input() позволяет получить значение атрибута с хоста компонента/директивы, но не отслеживает дальнейшее изменение атрибута.

14 сентября 2019 г. в Angular

Angular. Manually retry http request

На память. Некоторое время назад я решил достаточно необычную задачу, но в последствии на backend`е переделали логику и код был удалён из проекта.

Angular Resolver

Resolver гарантированно получает асинхронные данные до создания компонента исходя из параметров маршрута.