前言
Pipe 是 Angular 中用來轉換資料的方式, 讓我們可以在 Template 中對資料進行格式化或轉換, 並且可以在程式碼中重複利用. 這篇文章將介紹內建 Pipe 和如何建立自訂 Pipe.
Pipe 用途
Angular 的 Pipe 是一種轉換資料的方式, 它可以用在 Template 中對資料進行格式化或轉換等操作, 並可以在程式碼中進行重複利用.
Pipe 可以分為兩種類型:
- Angular 內建 Pipe: Angular 提供如
DatePipe、UpperCasePipe等 - 自訂 Pipe: 開發者自行建立的 Pipe
內建 Pipe
只需要在模板中使用管道符號 | 來調用 Pipe 即可. 以下是一些常用的內建 Pipe:
DatePipe
格式化日期.
<p>{{ today | date:'yyyy-MM-dd' }}</p>
<!-- 輸出:2023-03-17 -->
<p>{{ today | date:'fullDate' }}</p>
<!-- 輸出:Friday, March 17, 2023 -->
UpperCasePipe / LowerCasePipe
將文字轉為大寫或小寫.
<p>{{ name | uppercase }}</p>
<!-- 輸出:JOHN -->
<p>{{ name | lowercase }}</p>
<!-- 輸出:john -->
CurrencyPipe
格式化金額.
<p>{{ price | currency:'USD' }}</p>
<!-- 輸出:$1,234.56 -->
<p>{{ price | currency:'TWD':'symbol-narrow' }}</p>
<!-- 輸出:NT$1,234.56 -->
PercentPipe
格式化百分比.
<p>{{ rate | percent }}</p>
<!-- 輸出:75% -->
<p>{{ rate | percent:'1.2-2' }}</p>
<!-- 輸出:75.50% -->
DecimalPipe
格式化數字.
<p>{{ number | number:'1.2-2' }}</p>
<!-- 1.2-2 表示:至少 1 位整數,2-2 位小數 -->
AsyncPipe
處理非同步資料 (Observable 或 Promise).
<p>{{ data$ | async }}</p>
在 Component 中:
import { Observable } from 'rxjs';
export class AppComponent {
data$: Observable<string>;
constructor(private http: HttpClient) {
this.data$ = this.http.get<string>('/api/data');
}
}
自訂 Pipe
可以自行撰寫 Pipe, 擴充 Angular 的 Pipe 功能. 需要實作 PipeTransform Interface, 該介面只有一個 transform 方法, 負責處理資料轉換.
建立自訂 Pipe
使用 Angular CLI 建立:
ng generate pipe double
範例: 建立一個將數字乘以 2 的 Pipe
import { Pipe, PipeTransform } from "@angular/core";
// Pipe 裝飾器
@Pipe({
name: "double"
})
// 實作 PipeTransform Interface
export class DoublePipe implements PipeTransform {
transform(value: number): number {
return value * 2;
}
}
使用方式:
<p>{{ 5 | double }}</p>
<!-- 輸出:10 -->
帶參數的 Pipe
Pipe 也可以接收參數.
範例: 建立一個可以指定倍數的 Pipe
import { Pipe, PipeTransform } from "@angular/core";
@Pipe({
name: "multiply"
})
export class MultiplyPipe implements PipeTransform {
transform(value: number, multiplier: number = 1): number {
return value * multiplier;
}
}
使用方式:
<p>{{ 5 | multiply:3 }}</p>
<!-- 輸出:15 -->
<p>{{ 5 | multiply }}</p>
<!-- 輸出:5 (使用預設值 1) -->
實用範例: 文字截斷 Pipe
建立一個截斷長文字的 Pipe:
import { Pipe, PipeTransform } from "@angular/core";
@Pipe({
name: "truncate"
})
export class TruncatePipe implements PipeTransform {
transform(value: string, limit: number = 50, ellipsis: string = '...'): string {
if (!value) return '';
if (value.length <= limit) return value;
return value.substring(0, limit) + ellipsis;
}
}
使用方式:
<p>{{ longText | truncate:20 }}</p>
<!-- 只顯示前 20 個字元,後面加上 ... -->
鏈結多個 Pipe
可以將多個 Pipe 串連使用:
<p>{{ today | date:'fullDate' | uppercase }}</p>
<!-- 先格式化日期,再轉大寫 -->
<p>{{ price | currency:'USD' | lowercase }}</p>
Pure Pipe vs Impure Pipe
預設情況下, Pipe 是 Pure Pipe, 只有在輸入值改變時才會重新執行. 如果需要在每次變更檢測時都執行, 可以設定為 Impure Pipe:
@Pipe({
name: "myPipe",
pure: false // 設定為 Impure Pipe
})
export class MyPipe implements PipeTransform {
transform(value: any): any {
// 處理邏輯
}
}
注意: Impure Pipe 會影響效能, 應謹慎使用.
總結
Angular Pipe 是格式化和轉換資料的強大工具:
- 內建 Pipe: 提供常用的日期、數字、文字格式化功能
- 自訂 Pipe: 可以建立符合需求的資料轉換邏輯
- 可串連使用: 多個 Pipe 可以組合使用
- 支援參數: Pipe 可以接收參數來客製化行為
善用 Pipe 可以讓 Template 更加簡潔, 提高程式碼的可讀性和可維護性.