Директивы атрибутов¶
28.02.2022
Измените внешний вид или поведение элементов DOM и компонентов Angular с помощью директив атрибутов.
Смотрите код для рабочего примера, содержащего фрагменты кода, приведенные в этом руководстве.
Создание директивы атрибута¶
В этом разделе рассказывается о создании директивы выделения, которая устанавливает желтый цвет фона основного элемента.
-
Чтобы создать директиву, используйте команду CLI
ng generate directive
.1
ng generate directive highlight
CLI создает
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 отключит интерполяцию и привязку любого рода, такую как привязка свойств или привязка событий, для дочерних элементов.