Директивы атрибутов¶
30.09.2026
Директивы атрибутов меняют внешний вид или поведение элементов DOM и компонентов Angular.
Разовое поведение — через привязки шаблона¶
Синтаксис шаблона Angular уже умеет менять классы, стили, свойства и события одного элемента:
- Привязки класса и стиля добавляют и убирают CSS-классы и встроенные стили.
- Привязки свойств и атрибутов задают свойства DOM и HTML-атрибуты.
- Обработчики событий реагируют на действия пользователя.
Директива атрибута нужна, когда такое поведение стоит собрать в одну единицу и вешать на любой элемент или компонент.
Создание директивы атрибута¶
Своя директива атрибута — это класс JavaScript с декоратором @Directive(). Свойство selector декоратора задаёт атрибут, которым директиву применяют. Квадратные скобки делают селектор атрибутным: директива совпадает с элементами, у которых есть этот атрибут. По соглашению берут префикс вроде app, чтобы не столкнуться с чужими именами:
1 2 3 4 5 6 | |
Команда CLI ng generate directive создаёт заготовку директивы и файл её теста.
Хост директивы можно менять декларативно, через привязки хоста, или императивно, через ссылку на элемент-хост. В примере внедряется ElementRef: элемент берётся из свойства nativeElement, и фон красится в жёлтый.
highlight.directive.ts
1 2 3 4 5 6 7 8 9 10 11 12 | |
Директивы не поддерживают пространства имён.
1 | |
Применение директивы атрибута¶
Чтобы применить директиву, добавьте её селектор атрибутом элемента.
app.component.html
1 | |
Angular создаёт экземпляр HighlightDirective для этого элемента <p>, внедряет ссылку на элемент и красит его фон в жёлтый.
Обработка действий пользователя¶
Чтобы реагировать на действия пользователя, привяжите события элемента-хоста к методам-обработчикам через свойство host декоратора @Directive(). Следующая директива подсвечивает элемент-хост, пока над ним указатель, и снимает подсветку, когда указатель уходит.
highlight.directive.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
Свойство host сопоставляет события mouseenter и mouseleave с методами onMouseEnter() и onMouseLeave(). Те вызывают вспомогательный highlight(), который задаёт цвет фона элемента-хоста. Подробнее о привязках событий хоста — в разделе привязка к элементу-хосту.
Входные значения¶
Как и компоненты, директивы принимают входы через функцию input(). Назовите вход так же, как селектор: тогда одна привязка и применяет директиву, и передаёт ей значение.
highlight.directive.ts
1 | |
Вход читают вызовом, как сигнал. Если цвет не задан, берут значение по умолчанию.
highlight.directive.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
В шаблоне значение привязывают к селектору. Вход называется так же, как селектор, поэтому [appHighlight] и применяет директиву, и задаёт её значение. Здесь привязанный color — свойство компонента.
app.component.html
1 | |
app.component.ts
1 2 3 | |
У директивы может быть больше одного входа. Следующая добавляет вход defaultColor и перебирает запасные значения: сначала appHighlight, затем defaultColor и в конце red.
highlight.directive.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
Оба входа привязывают на одном элементе. defaultColor получает статическую строку, а не динамическое выражение, поэтому квадратные скобки не нужны.
app.component.html
1 | |
Отключение обработки Angular через NgNonBindable¶
Чтобы браузер не вычислял выражения, добавьте ngNonBindable на элемент-хост. ngNonBindable отключает в шаблонах интерполяцию, директивы и привязки.
В примере выражение {{ 1 + 1 }} выводится так же, как в редакторе кода, и не превращается в 2.
app.component.html
1 2 | |
ngNonBindable на элементе отключает привязки у его дочерних элементов. При этом директивы на том самом элементе, куда повесили ngNonBindable, продолжают работать. В примере директива appHighlight всё ещё активна, но выражение {{ 1 + 1 }} Angular не вычисляет.
app.component.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
Если повесить ngNonBindable на родительский элемент, Angular отключает у его потомков интерполяцию и любые привязки, в том числе привязку свойства и привязку события.
Что дальше¶
Источник: https://angular.dev/guide/directives/attribute-directives