前言

Directive(指令)是 Angular 中用來擴充 HTML 元素的強大功能。這篇文章將介紹三種 Directive 類型以及它們的用途。

Directive 用途

Angular Directive 是用來擴充 HTML 的元素、屬性、class、樣式,可以透過 Directive 自定義 HTML 元素的行為和樣式。

Angular 有三種 Directive:

  • Component Directive:用來構建可重複使用的 Component
  • Attribute Directive:用來更改元素的外觀和行為
  • Structural Directive:用來改變 HTML 的布局結構

Component Directive

可以把 Component Directive 當作是一個帶有模板的指令,用來構建可重複使用的且有模板的元件。它可以與其它 Directive、元素、屬性一起使用。

Attribute Directive

Attribute Directive 可以修改 HTML 元素的外觀行為。Angular 提供了內建的 Attribute Directive:

ngClass

用於動態添加或移除 CSS class。

<div [ngClass]="{'active': isActive, 'disabled': isDisabled}">
  Content
</div>

在 Component 中:

export class AppComponent {
  isActive: boolean = true;
  isDisabled: boolean = false;
}

ngStyle

用於動態設定元素的 inline style。

<div [ngStyle]="{'color': textColor, 'font-size': fontSize + 'px'}">
  Styled text
</div>

在 Component 中:

export class AppComponent {
  textColor: string = "blue";
  fontSize: number = 16;
}

Structural Directive

Structural Directive 可以改變 HTML 的布局和結構,可以用來添加刪除替換 DOM 元素,從而改變 DOM 結構本身。

Angular 提供了三種內置 Structural Directive:

*ngIf

用於根據條件顯示或隱藏元素。

<div *ngIf="isLoggedIn">
  Welcome back!
</div>

<div *ngIf="isLoggedIn; else loginTemplate">
  Welcome back!
</div>
<ng-template #loginTemplate>
  <div>Please login</div>
</ng-template>

*ngFor

用於對集合進行迴圈,重複渲染元素。

<ul>
  <li *ngFor="let item of items; let i = index">
    {{ i + 1 }}. {{ item.name }}
  </li>
</ul>

在 Component 中:

export class AppComponent {
  items = [
    { name: "Item 1" },
    { name: "Item 2" },
    { name: "Item 3" }
  ];
}

[ngSwitch]

用於根據表達式的值,顯示或隱藏多個元素之一。

<div [ngSwitch]="userRole">
  <div *ngSwitchCase="'admin'">Admin Dashboard</div>
  <div *ngSwitchCase="'user'">User Dashboard</div>
  <div *ngSwitchDefault>Guest Dashboard</div>
</div>

自訂 Directive

除了內建的 Directive,我們也可以建立自訂的 Directive。

使用 Angular CLI 建立 Directive:

ng generate directive highlight

範例:建立一個改變背景顏色的 Directive

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {
  constructor(private el: ElementRef) {}

  @HostListener('mouseenter') onMouseEnter() {
    this.el.nativeElement.style.backgroundColor = 'yellow';
  }

  @HostListener('mouseleave') onMouseLeave() {
    this.el.nativeElement.style.backgroundColor = '';
  }
}

使用方式:

<p appHighlight>Hover over me!</p>

總結

Angular Directive 是擴充 HTML 功能的強大工具:

  • Component Directive:帶有模板的可重複使用元件
  • Attribute Directive:修改元素外觀和行為(ngClass、ngStyle)
  • Structural Directive:改變 DOM 結構(*ngIf、*ngFor、[ngSwitch])

掌握這些 Directive 的使用,可以讓你的 Angular 應用更加靈活和強大。

參考資料