Spec-Zone.ru › Angular

DI на практике

Это руководство рассказывает о дополнительных возможностях внедрения зависимостей (DI) в Angular.

ПРИМЕЧАНИЕ: Подробную информацию об InjectionToken и пользовательских провайдерах см. в руководстве по определению провайдеров зависимостей.

Внедрение DOM-элемента компонента

Хотя разработчики обычно стараются этого избегать, для некоторых визуальных эффектов и сторонних инструментов требуется прямой доступ к DOM. В таких случаях может понадобиться доступ к DOM-элементу компонента.

Angular предоставляет доступ к базовому DOM-элементу @Component или @Directive с помощью внедрения токена ElementRef:

import {Directive, ElementRef, inject} from '@angular/core';

@Directive({
  selector: '[appHighlight]',
})
export class HighlightDirective {
  private element = inject(ElementRef);

  update() {
    this.element.nativeElement.style.color = 'red';
  }
}

Внедрение имени тега элемента-хоста

Чтобы получить имя тега элемента-хоста, внедрите его с помощью токена HOST_TAG_NAME.

import {Directive, HOST_TAG_NAME, inject} from '@angular/core';

@Directive({
  selector: '[roleButton]',
})
export class RoleButtonDirective {
  private tagName = inject(HOST_TAG_NAME);

  onAction() {
    switch (this.tagName) {
      case 'button':
        // Handle button action
        break;
      case 'a':
        // Handle anchor action
        break;
      default:
        // Handle other elements
        break;
    }
  }
}

ПРИМЕЧАНИЕ: Если у элемента-хоста может не быть имени тега (например, у ng-container или ng-template), сделайте внедрение необязательным.

Разрешение циклических зависимостей с помощью предварительной ссылки

В TypeScript важен порядок объявлений классов. Нельзя напрямую ссылаться на класс, пока он не объявлен.

Обычно это не проблема, особенно если вы следуете рекомендуемому правилу один класс на файл. Однако в некоторых случаях циклических ссылок не избежать. Например, если класс 'A' ссылается на класс 'B', а класс 'B' — на класс 'A', один из них необходимо объявить первым.

Функция Angular forwardRef() создаёт косвенную ссылку, которую Angular может разрешить позже.

Похожая проблема возникает, когда класс ссылается на самого себя. Например, в его массиве providers. Массив providers — это свойство функции-декоратора @Component(), которая должна находиться перед определением класса. Такие циклические ссылки можно разрешить с помощью forwardRef.

providers: [
  {
    provide: PARENT_MENU_ITEM,
    useExisting: forwardRef(() => MenuItem),
  },
],

Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/guide/di/di-in-action

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API