Angular Forms: Template-driven vs Reactive Forms เลือกใช้แบบไหนดี

#angular12 เม.ย. 2569

Angular Forms มี 2 แบบ

Angular มีวิธีจัดการ Form 2 แบบหลัก คือ Template-driven Forms และ Reactive Forms แต่ละแบบมีจุดเด่นต่างกัน

Template-driven Forms

เหมาะกับ form ง่ายๆ ที่ไม่ซับซ้อน

import { FormsModule } from '@angular/forms';

@Component({
  standalone: true,
  imports: [FormsModule],
  template: `
    <form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
      <input name="email" ngModel required email />
      <input name="password" ngModel required minlength="6" />
      <button type="submit" [disabled]="myForm.invalid">Login</button>
    </form>
  `
})
export class LoginComponent {
  onSubmit(form: NgForm) {
    console.log(form.value);
  }
}

Reactive Forms

เหมาะกับ form ซับซ้อน ต้องการ validation แบบ dynamic

import { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms';

@Component({
  standalone: true,
  imports: [ReactiveFormsModule],
  template: `
    <form [formGroup]="form" (ngSubmit)="onSubmit()">
      <input formControlName="email" />
      <span *ngIf="form.get('email')?.invalid">Email ไม่ถูกต้อง</span>
      <input formControlName="password" type="password" />
      <button type="submit" [disabled]="form.invalid">Login</button>
    </form>
  `
})
export class LoginComponent {
  form = this.fb.group({
    email: ['', [Validators.required, Validators.email]],
    password: ['', [Validators.required, Validators.minLength(6)]]
  });

  constructor(private fb: FormBuilder) {}

  onSubmit() {
    console.log(this.form.value);
  }
}

Custom Validator

import { AbstractControl, ValidationErrors } from '@angular/forms';

export function thaiPhoneValidator(control: AbstractControl): ValidationErrors | null {
  const value = control.value;
  if (!value) return null;
  const valid = /^0[6-9]\d{8}$/.test(value);
  return valid ? null : { thaiPhone: true };
}

เปรียบเทียบ

หัวข้อ Template-driven Reactive
ความซับซ้อน ต่ำ สูง
Unit test ยาก ง่าย
Dynamic form ยาก ง่าย
เหมาะกับ Form เล็ก Form ใหญ่

สรุป

ถ้า form ง่ายใช้ Template-driven ถ้า form ซับซ้อนหรือต้องการ test ใช้ Reactive Forms ครับ