## 創建一個屬性型指令
屬性型指令至少需要一個帶有`@[Directive]`裝飾器的控制器類。該裝飾器指定了一個用于標識屬性的選擇器。 控制器類實現了指令需要的指令行為。
### 一、創建指令類
>[info] 在CLI輸入命令:ng g directive highlight (指令類名)
輸入命令后創建的指令類 `src/app/highlight.directive.ts`
```
import { Directive } from '@angular/core';
@Directive({
selector: '[appHighlight]' //屬性指令的名稱,使用前綴避免與內部指令沖突
})
export class HighlightDirective {
constructor() { }
}
```
### 二、引入`ElementRef`模塊操作DOM元素
```
import { Directive,ElementRef } from '@angular/core';
//引入ElementReft模塊操作DOM
@Directive({
selector: '[appHighlight]' //屬性指令的名稱,使用前綴避免與內部指令沖突
})
export class HighlightDirective {
//修改元素的背景顏色
constructor(el: ElementRef) {
el.nativeElement.style.backgroundColor = 'yellow';
}
}
```
### 三、引入?`HostListener`裝飾器響應指令所在元素的事件
```
import { Directive,ElementRef ,HostListener} from '@angular/core';
//引入HostListener響應指令的事件
@Directive({
selector: '[appHighlight]' //屬性指令的名稱,使用前綴避免與內部指令沖突
})
export class HighlightDirective {
//綁定事件,響應指令的行為
//鼠標移入事件
@HostListener('mouseenter') onMouseEnter() {
this.highlight('yellow');
}
//鼠標移出事件
@HostListener('mouseleave') onMouseLeave() {
this.highlight(null);
}
//修改元素的背景顏色
private highlight(color: string) {
this.el.nativeElement.style.backgroundColor = color;
}
}
```
### 四、使用`Input`數據綁定向指令傳遞值
```
import { Directive,ElementRef ,HostListener,Input} from '@angular/core';
//引入Input模塊 用于外部向指令傳值
@Directive({
selector: '[appHighlight]' //屬性指令的名稱,使用前綴避免與內部指令沖突
})
export class HighlightDirective {
//定義外部傳遞給指令的屬性
//使用別名,外部使用appHighlight傳遞值,內部使用highlightColor代表值
@Input('appHighlight') highlightColor: string;
@Input() defaultColor: string; //第二個屬性,傳遞的默認值
constructor(private el: ElementRef) {}
//綁定事件,響應指令行為
//鼠標移入事件
@HostListener('mouseenter') onMouseEnter() {
//賦予默認值,當用戶沒有傳遞值時使用默認值
this.highlightColor = (this.highlightColor||this.defaultColor || '#673ab7');
this.highlight(this.highlightColor);
}
//鼠標移出事件
@HostListener('mouseleave') onMouseLeave() {
this.highlight(null);
}
private highlight(color: string) {
this.el.nativeElement.style.backgroundColor = color;
}
}
```
### 五、使用自定義指令
```
//傳遞第二個參數,defaultColor="violet"
<p [appHighlight]='color' defaultColor="violet">DIV指令</p>
//沒有傳值,使用默認值
<p [appHighlight]="color" class="hello">Highlight me!</p>
export class AppComponent {
color: string;
}
```
- 目錄結構
- 架構
- 指令
- 數據綁定
- 結構性指令
- 屬性型指令
- 自定義指令
- 模板引用變量
- 屬性綁定
- 事件綁定
- 組件
- 組件交互
- 管道
- 自定義管道
- 動態組件
- 變量檢測機制
- 組件生命周期
- 路由
- 路由配置
- 路由導航
- 路由傳值
- 父子路由
- 路由事件
- 頂級路由和特征路由
- 多重路由
- 路由守衛
- 路由守衛-簡單理解
- 路由惰性加載
- 路由預加載
- 路由動畫
- 網絡請求
- GET請求
- POST請求
- JSOP請求
- 封裝的http請求
- http攔截器
- 表單
- 響應式表單
- 驅動式表單
- CLI命令
- 啟動應用
- 創建項目
- 創建組件
- 創建服務
- 創建路由守衛
- 創建特征模塊
- 創建自定義指令
- 創建自定義管道
- 相關概念
- 急性加載
- 惰性加載
- 特征模塊
- 常見問題
- 全局的Angular CLI大于本地的Angular CLI
- 包體優化