Template-driven form adalah form yang aturannya ditulis langsung di template, sebagai atribut HTML: required, pattern, min. Kamu gak membuat FormGroup sendiri; Angular membacanya dari template dan membangun kontrol-kontrolnya di belakang layar. Bayangin formulir pesan-antar Martabak Bang Jali yang aturannya sudah tercetak di kertasnya: "wajib diisi" di bawah kolom nama, "diawali 08" di bawah kolom HP. Kasir gak perlu buku aturan; dia membaca aturannya dari kertas itu. Tapi kolom tanpa judul gak dia hitung sama sekali.
🧪 Tebakan cepat: Di dalam
<form #f="ngForm">, kolom HP ditulis<input ngModel required />, tanpa atributname. Nama sudah diisi, jumlah 1, HP masih kosong. Tombol<button [disabled]="f.invalid">mati atau menyala? Jawabannya ada di bagian "name: tanpa itu kolomnya gak terdaftar".
ngForm dan ngModel
Form pesanan yang sama dengan pelajaran Reactive Forms, ditulis dengan cara template-driven:
import { Component } from '@angular/core'
import { FormsModule, NgForm } from '@angular/forms'
@Component({
selector: 'app-pesanan',
standalone: true,
imports: [FormsModule],
template: `
<form #f="ngForm" (ngSubmit)="kirim(f)">
<input name="nama" ngModel required placeholder="Nama" #nama="ngModel" />
@if (nama.touched && nama.errors?.['required']) {
<p class="error">Nama wajib diisi.</p>
}
<input name="hp" ngModel required pattern="08[0-9]{8,11}" placeholder="Nomor HP" #hp="ngModel" />
@if (hp.touched && hp.errors?.['required']) {
<p class="error">Nomor HP wajib diisi.</p>
}
@if (hp.touched && hp.errors?.['pattern']) {
<p class="error">Nomor HP diawali 08, total 10 sampai 13 angka.</p>
}
<input name="jumlah" type="number" [ngModel]="1" required min="1" #jumlah="ngModel" />
@if (jumlah.touched && jumlah.errors) {
<p class="error">Jumlah minimal 1.</p>
}
<button type="submit" [disabled]="f.invalid">Kirim</button>
</form>
`,
})
export class Pesanan {
kirim(f: NgForm) {
console.log('terkirim:', JSON.stringify(f.value))
}
}
FormsModulediimportsmembuat Angular otomatis memasang directiveNgFormdi setiap<form>. NgForm itulah yang diam-diam memegangFormGroup-nya.#f="ngForm"mengekspor NgForm itu ke variabel templatef, jadif.value,f.valid, danf.invalidbisa dibaca. Tanpa="ngForm",fcuma elemen<form>HTML biasa.ngModelplusname="hp"mendaftarkan kolom itu ke form sebagai kontrol bernamahp.f.valueberisi{"nama":"","hp":"","jumlah":1}.- Aturannya atribut biasa:
required,pattern="08[0-9]{8,11}",min="1"(ditype="number"),minlength="3",email. Isierrors-nya sama persis dengan Validators di reactive form:{ required: true },{ pattern: { requiredPattern: '^08[0-9]{8,11}