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> другого компонента. Внутренний компонент будет искать зависимости во внешнем компоненте.

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

Angular. Can't set breakpoints in VS Code

Вариант решения проблемы, когда не срабатывают точки остановки при разработке Angular приложений в редакторе VS Code
10 апреля 2018 г. в Angular

Angular. Manually retry http request

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