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

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

#local variable внутри *ngIf

Представлены 2 варианта решения, как сослаться на локальную переменную шаблона (#myVar) за пределами шаблона:

  • @ViewChild
  • @ViewChildren
13 февраля 2019 г. в Angular

let-* $implicit in Angular template

Синтаксис let-* позволяет объявить переменную в шаблоне <ng-template>, использования ключа $implicit позволяет устанавливать значение по-умолчанию для объявленной переменной.

29 августа 2018 г. в Angular

Angular. Редирект по условию

Пример условного перенаправления пользователя в зависимости от некого количества

  • 0 - dashboard
  • 1 - карточка
  • 2 и более - список
10 января 2019 г. в Angular

Angular. Когда не надо отписываться в RxJS?

В async pipe за вас отпишется Angular. Во всех остальных случаях лучше отписываться самостоятельно. Допускается не отписываться в потоках, где будет гарантировано вызван complete.