Директивы в Angular — это специальные конструкции, которые добавляют дополнительное поведение элементам DOM. Они делятся на два основных типа: структурные и атрибутные.
Структурные директивы изменяют структуру DOM, добавляя или удаляя элементы. Их можно узнать по звездочке (*) в синтаксисе.
*
<ng-template>
под капотом<div *ngIf="isVisible; else notVisible">
Контент виден
</div>
<ng-template #notVisible>
<div>Альтернативный контент</div>
</ng-template>
<ul>
<li *ngFor="let item of items; index as i; trackBy: trackById">
{{i + 1}}. {{item.name}}
</li>
</ul>
<div [ngSwitch]="userRole">
<p *ngSwitchCase="'admin'">Админ-панель</p>
<p *ngSwitchCase="'user'">Профиль пользователя</p>
<p *ngSwitchDefault>Гостевая версия</p>
</div>
Атрибутные директивы изменяют внешний вид или поведение существующих элементов, не изменяя структуру DOM.
<div [ngClass]="{
'active': isActive,
'disabled': isDisabled,
'highlight': hasError
}"></div>
<button [ngStyle]="{
'color': isPrimary ? 'white' : 'black',
'background-color': buttonColor,
'font-size.px': fontSize
}">Кнопка</button>
<input [(ngModel)]="userName" placeholder="Введите имя">
Характеристика | Структурные | Атрибутные |
---|---|---|
Влияние на DOM | Изменяют структуру | Модифицируют элементы |
Синтаксис | Префикс * | Обычные атрибуты |
Примеры | *ngIf, *ngFor, *ngSwitch | ngClass, ngStyle, ngModel |
Внутренняя реализация | Работают с ng-template | Работают с HostElement |
@Directive({
selector: '[appHighlight]'
})
export class HighlightDirective {
@HostListener('mouseenter') onMouseEnter() {
this.highlight('yellow');
}
constructor(private el: ElementRef) {}
private highlight(color: string) {
this.el.nativeElement.style.backgroundColor = color;
}
}
Использование:
<p appHighlight>Наведи на меня</p>
@Directive({
selector: '[appRepeat]'
})
export class RepeatDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) {}
@Input() set appRepeat(times: number) {
this.viewContainer.clear();
for (let i = 0; i < times; i++) {
this.viewContainer.createEmbeddedView(this.templateRef, {
$implicit: i + 1
});
}
}
}
Использование:
<ng-template appRepeat="5" let-number>
<p>Элемент {{number}}</p>
</ng-template>
структурные директивы (*ngIf, *ngFor) управляют структурой DOM, а атрибутные (ngClass, ngStyle) изменяют свойства существующих элементов. Понимание различий между ними позволяет эффективно управлять отображением и поведением компонентов в Angular-приложениях.