開發前端表單時,使用 Angular Signal Forms 的正確模式
開發含有表單的前端頁面時,優先使用 Angular Signal Forms 模式。
<form> 元素的頁面時問題:使用 (ngSubmit) 搭配 async onSubmit() 會導致瀏覽器預設提交行為觸發,造成頁面重載。
<!-- ❌ 錯誤寫法 -->
<form (ngSubmit)="onSubmit()">
<!-- ✅ 正確寫法 -->
<form (submit)="$event.preventDefault(); onSubmit()">
檢查步驟:
<form> 元素(ngSubmit)onSubmit() 是 async 函數,應改用 (submit)="$event.preventDefault(); onSubmit()"檢查 TypeScript 是否正確 import:
// ✅ 正確 import
import { form, FormField, required, email, minLength, validate, submit } from '@angular/forms/signals';
常用 API:
form() - 建立表單FormField - Directive,用於 template 綁定submit() - 提交表單,會先執行驗證required(), email(), minLength(), maxLength() - 內建驗證器validate() - 自訂驗證器檢查表單模型是否使用 signal:
// ✅ 正確寫法
readonly formModel = signal<LoginFormData>({
email: '',
password: ''
});
readonly loginForm = form(this.formModel, (f) => {
required(f.email, { message: '請輸入 Email' });
email(f.email, { message: '請輸入有效的 Email 格式' });
required(f.password, { message: '請輸入密碼' });
});
檢查輸入元件是否使用 [formField] 綁定:
<!-- ✅ 正確寫法 -->
<fm-labeled-input
[formField]="loginForm.email"
label="Email"
placeholder="請輸入 Email"
/>
<!-- ❌ 不要混用 Reactive Forms 的 formControlName -->
<input formControlName="email" />
檢查 submit 函數的使用方式:
// ✅ 正確寫法
async onSubmit(): Promise<void> {
await submit(this.loginForm, async () => {
// 驗證通過後執行
const { email, password } = this.formModel();
await this.authService.login(email, password);
});
}
form() 建立表單並設定驗證器[formField] 綁定輸入元件(submit)="$event.preventDefault(); onSubmit()" 處理提交onSubmit() 中使用 submit() 函數執行驗證與提交| Reactive Forms | Signal Forms |
|---|---|
(ngSubmit)="onSubmit()" |
(submit)="$event.preventDefault(); onSubmit()" |
formControlName="email" |
[formField]="form.email" |
[formGroup]="form" |
移除,Signal Forms 不需要 |
this.form.value |
this.formModel() |
this.form.valid |
this.loginForm.valid() |
apps/docs-viewer/src/content/docs/agentSelfFeedback/angular-signal-forms-submit.mdapps/web/src/app/pages/register/register.component.ts(參考實作)