Input / Output 設定選項
Input 設定選項
Angular 提供了幾種方式來設定 @Input()
的行為,讓資料傳遞更加靈活。
alias 選項
使用 alias
可以為 input 屬性設定別名,使得元件內部的屬性名稱與外部使用的名稱可以不同:
// 新版 signals 寫法
data = input.required<Ticket>({ alias: 'task' });
這樣設定後:
在元件內部,我們使用
this.data()
來存取此屬性在元件外部(父元件的模板),則使用
[task]
來綁定資料
<!-- 在父元件範本中 -->
<app-ticket-card [task]="someTicket"></app-ticket-card>
注意:除非有充分的理由,否則不建議使用 alias,因為這樣可能導致混淆和理解困難。
transform 選項
transform
選項允許你提供一個函數,這個函數會在元件接收到輸入值時自動執行,並可以轉換該值:
// 新版 signals 寫法
data = input.required<Ticket>({
transform: (value) => {
// 如果收到字串,轉為物件
if (typeof value === 'string') {
return JSON.parse(value);
}
return value;
}
});
transform
非常適合用於:
資料型別轉換(如字串轉物件)
資料淨化與驗證
預設值處理
複雜物件的深拷貝
Output 設定選項
Output 相較於 Input 設定選項較少,主要就是 alias
。
alias 選項
// 新版 signals 寫法
close = output<void>({ alias: 'closeAction' });
// 使用時
this.close.emit();
在父元件中監聽事件時,使用別名:
<!-- 在父元件範本中 -->
<app-modal (closeAction)="handleClose()"></app-modal>
傳統裝飾器寫法對比
對比新版的 signal 寫法,傳統的裝飾器寫法也支援這些設定:
Input 裝飾器寫法
// 使用 alias
@Input('task') data: Ticket;
// 沒有直接的 transform 選項,通常透過 setter 實現
private _data: Ticket;
@Input('task')
set data(value: Ticket | string) {
if (typeof value === 'string') {
this._data = JSON.parse(value);
} else {
this._data = value;
}
}
get data(): Ticket {
return this._data;
}
Output 裝飾器寫法
@Output('closeAction') close = new EventEmitter<void>();
最佳實踐
一致性: 選擇一種風格並在整個應用中保持一致
命名: 使用有意義的名稱,避免簡寫
謹慎使用 alias: 只在確實需要時使用別名
Last updated