Директивы атрибутов¶
28.02.2022
Измените внешний вид или поведение элементов DOM и компонентов Angular с помощью директив атрибутов.
Смотрите код для рабочего примера, содержащего фрагменты кода, приведенные в этом руководстве.
Создание директивы атрибута¶
В этом разделе рассказывается о создании директивы выделения, которая устанавливает желтый цвет фона основного элемента.
-
Чтобы создать директиву, используйте команду CLI
ng generate directive.1ng generate directive highlightCLI создает
src/app/highlight.directive.ts, соответствующий тестовый файлsrc/app/highlight.directive.spec.tsи объявляет класс директивы вAppModule.CLI генерирует стандартный
src/app/highlight.directive.tsследующим образом:1 2 3 4 5 6
import { Directive } from '@angular/core'; @Directive({ selector: '[appHighlight]', }) export class HighlightDirective {}Свойство конфигурации декоратора
@Directive()определяет селектор CSS-атрибутов директивы,[appHighlight]. -
Импортируйте
ElementRefиз@angular/core.ElementRefпредоставляет прямой доступ к основному элементу DOM через свойствоnativeElement. -
Добавьте
ElementRefвconstructor()директивы для inject ссылки на основной элемент DOM, элемент, к которому вы применяетеappHighlight. -
Добавьте логику в класс
HighlightDirective, которая устанавливает желтый фон.1 2 3 4 5 6 7 8 9 10 11
import { Directive, ElementRef } from '@angular/core'; @Directive({ selector: '[appHighlight]', }) export class HighlightDirective { constructor(private el: ElementRef) { this.el.nativeElement.style.backgroundColor = 'yellow'; } }
Внимание
Директивы не поддерживают пространства имен.
1 | |
Применение директивы атрибута¶
Чтобы использовать HighlightDirective, добавьте элемент <p> в HTML-шаблон с директивой в качестве атрибута.
1 | |
Angular создает экземпляр класса HighlightDirective и вставляет ссылку на элемент <p> в конструктор директивы, который устанавливает стиль фона элемента <p> на желтый.
Обработка событий пользователя¶
В этом разделе показано, как определить, когда пользователь наводит мышь на элемент или выходит из него, и отреагировать, установив или убрав цвет подсветки.
-
Импортируйте
HostListenerиз '@angular/core'.1 2 3 4 5
import { Directive, ElementRef, HostListener, } from '@angular/core'; -
Добавьте два обработчика событий, которые реагируют, когда мышь входит или выходит, каждый с декоратором
@HostListener().1 2 3 4 5 6 7 8 9 10 11
@HostListener('mouseenter') onMouseEnter() { this.highlight('yellow'); } @HostListener('mouseleave') onMouseLeave() { this.highlight(''); } private highlight(color: string) { this.el.nativeElement.style.backgroundColor = color; }
Подписка на события элемента DOM, в котором размещена директива атрибутов, в данном случае <p>, с помощью декоратора @HostListener().
Обработчики делегируют вспомогательному методу highlight(), который устанавливает цвет для основного элемента DOM, el.
Полная директива выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Цвет фона появляется при наведении указателя на элемент абзаца и исчезает при перемещении указателя.
Передача значений в директиву атрибутов¶
В этом разделе мы рассмотрим установку цвета подсветки при применении директивы HighlightDirective.
-
В
highlight.directive.tsимпортируйтеInputиз@angular/core.1 2 3 4 5 6
import { Directive, ElementRef, HostListener, Input, } from '@angular/core'; -
Добавьте свойство
appHighlight@Input().1@Input() appHighlight = '';Декоратор
@Input()добавляет метаданные к классу, которые делают свойство директивыappHighlightдоступным для привязки. -
В
app.component.tsдобавьте свойствоcolorкAppComponent.1 2 3
export class AppComponent { color = 'yellow'; } -
Чтобы одновременно применить директиву и цвет, используйте связывание свойств с селектором директивы
appHighlight, установив его равнымcolor.1<p [appHighlight]="color">Highlight me!</p>Привязка атрибута
[appHighlight]выполняет две задачи:- Применяет директиву подсветки к элементу
<p>. - Устанавливает цвет выделения директивы с помощью привязки свойства.
- Применяет директиву подсветки к элементу
Установка значения с помощью пользовательского ввода¶
Этот раздел поможет вам добавить радиокнопки для привязки выбора цвета к директиве appHighlight.
-
Добавьте разметку в
app.component.htmlдля выбора цвета следующим образом:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
<h1>My First Attribute Directive</h1> <h2>Pick a highlight color</h2> <div> <input type="radio" name="colors" (click)="color='lightgreen'" />Green <input type="radio" name="colors" (click)="color='yellow'" />Yellow <input type="radio" name="colors" (click)="color='cyan'" />Cyan </div> <p [appHighlight]="color">Highlight me!</p> -
Измените
AppComponent.colorтак, чтобы он не имел начального значения.1 2 3
export class AppComponent { color = ''; } -
В
highlight.directive.tsпересмотрите методonMouseEnterтак, чтобы он сначала пытался выделить с помощьюappHighlightи возвращался кred, еслиappHighlightявляетсяundefined.1 2 3
@HostListener('mouseenter') onMouseEnter() { this.highlight(this.appHighlight || 'red'); } -
Проверьте свое приложение, чтобы убедиться, что пользователь может выбрать цвет с помощью радиокнопок.
Привязка ко второму свойству¶
Этот раздел поможет вам настроить приложение так, чтобы разработчик мог установить цвет по умолчанию.
-
Добавьте второе свойство
Input()вHighlightDirectiveпод названиемdefaultColor.1@Input() defaultColor = ''; -
Пересмотрите директиву
onMouseEnterтак, чтобы она сначала пыталась выделить с помощьюappHighlight, затем с помощьюdefaultColor, и возвращалась кred, если оба свойстване определены.1 2 3
@HostListener('mouseenter') onMouseEnter() { this.highlight(this.appHighlight || this.defaultColor || 'red'); } -
Чтобы привязать к
AppComponent.colorи вернуться к "фиолетовому" цвету по умолчанию, добавьте следующий HTML.В этом случае для привязки
defaultColorне используются квадратные скобки,[], поскольку она статична.1 2 3
<p [appHighlight]="color" defaultColor="violet"> Highlight me too! </p>Как и в случае с компонентами, вы можете добавить несколько привязок свойств директив к элементу
host.
Если нет привязки цвета по умолчанию, то цвет по умолчанию красный. Когда пользователь выбирает цвет, выбранный цвет становится активным цветом подсветки.
Деактивация обработки Angular с помощью NgNonBindable.¶
Чтобы предотвратить оценку выражения в браузере, добавьте ngNonBindable к элементу host. ngNonBindable деактивирует интерполяцию, директивы и привязку в шаблонах.
В следующем примере выражение {{ 1 + 1 }} отображается так же, как и в вашем редакторе кода, и не отображает 2.
1 2 | |
Применение ngNonBindable к элементу останавливает привязку для дочерних элементов этого элемента. Однако ngNonBindable по-прежнему позволяет директивам работать с элементом, к которому вы применили ngNonBindable.
В следующем примере директива appHighlight все еще активна, но Angular не оценивает выражение {{ 1 + 1 }}}.
1 2 3 4 5 | |
Если вы примените ngNonBindable к родительскому элементу, Angular отключит интерполяцию и привязку любого рода, такую как привязка свойств или привязка событий, для дочерних элементов.


