directive
指令
在 Angular 中有三种类型的指令:
- 组件 — 拥有模板的指令
- 结构型指令 — 通过添加和移除 DOM 元素改变 DOM 布局的指令
- 属性型指令 — 改变元素、组件或其它指令的外观和行为的指令。
组件是这三种指令中最常用的。组件可以在原生 HTML 元素中管理一小片区域的 HTML。从技术角度说,它就是一个带模板的指令。
结构型指令修改视图的结构。例如,NgFor
和 NgIf
。
属性型指令改变一个元素的外观或行为。例如,内置的 NgStyle
指令可以同时修改元素的多个样式。
属性型指令
appHighlight
/[appHighlight]="color"
@Directive({ selector: "[appHighlight]" })
改变一个元素的外观或行为
0x01 构建一个属性型指令,它用于修改一个元素的行为
ng generate directive highlight
属性型指令至少需要一个带有 @Directive
装饰器的控制器类。该装饰器指定了一个用于标识属性的选择器。 控制器类实现了指令需要的指令行为。
和组件一样,指令也必须在 Angular 模块中进行声明。
.directive.ts
import { Directive, ElementRef, HostListener, Input } from "@angular/core";
@Directive({
selector: "[appHighlight]"
})
export class HighlightDirective {
constructor(private el: ElementRef) {
el.nativeElement.style.backgroundColor = "yellow";
}
@Input("appHighlight") highlightColor: string;
@Input() defaultColor: string;
@HostListener("mouseenter") onMouseEnter() {
this.highlight(this.highlightColor || this.defaultColor || "red");
}
@HostListener("mouseleave") onMouseLeave() {
this.highlight(null);
}
private highlight(color: string) {
this.el.nativeElement.style.backgroundColor = color;
}
}
.component.ts
<p appHighlight>Highlight me!</p>
<p [appHighlight]="color" defaultColor="violet">Highlight me!</p>
.module.ts
@NgModule({
declarations: [HighlightComponent, HighlightDirective]
})
export class DocumentModule {}