# テンプレート駆動フォーム テンプレート駆動フォームは、双方向データバインディング(`[(ngModel)]`)を使用して、テンプレートで変更が加えられるとコンポーネントのデータモデルを更新し、その逆も同様に行います。シンプルなフォームに最適で、HTMLテンプレート内のディレクティブを使用してフォームの状態とバリデーションを管理します。 ## 主要なディレクティブ テンプレート駆動フォームは `FormsModule` に依存しており、以下の主要なディレクティブを提供します: - `NgModel`: フォーム要素の値の変更をデータモデルと調整します(`[(ngModel)]`)。 - `NgForm`: `
` タグにバインドされたトップレベルの `FormGroup` を自動的に作成します。 - `NgModelGroup`: DOM要素にバインドされたネストされた `FormGroup` を作成します。 ## セットアップ まず、コンポーネントまたはモジュールに `FormsModule` をインポートします。 ```ts import {Component} from '@angular/core'; import {FormsModule} from '@angular/forms'; @Component({ selector: 'app-user-form', imports: [FormsModule], templateUrl: './user-form.component.html', }) export class UserForm { user = {name: '', role: 'Guest'}; onSubmit() { console.log('Form submitted!', this.user); } } ``` ## フォームテンプレートの構築 ### `[(ngModel)]` による双方向バインディング 入力要素に `[(ngModel)]` を使用します。**`[(ngModel)]` を使用するすべての要素には `name` 属性が必須です。** Angularは `name` 属性を使用して、親 `NgForm` にコントロールを登録します。 ```html
``` ## フォームとコントロールの状態 Angularは状態に基づいてコントロールとフォームにCSSクラスを自動的に適用します: | 状態 | Trueの場合のクラス | Falseの場合のクラス | | :------------- | :-------------------------------- | :------------- | | 訪問済み | `ng-touched` | `ng-untouched` | | 値が変更済み | `ng-dirty` | `ng-pristine` | | 値が有効 | `ng-valid` | `ng-invalid` | | フォーム送信済み | `ng-submitted`(`
` のみ) | - | これらのクラスをCSSでビジュアルフィードバックとして使用できます: ```css .ng-valid[required], .ng-valid.required { border-left: 5px solid #42a948; /* 緑 */ } .ng-invalid:not(form) { border-left: 5px solid #a94442; /* 赤 */ } ``` ## バリデーションとエラーメッセージ 条件付きでエラーメッセージを表示するには、`ngModel` ディレクティブをテンプレート参照変数(例: `#nameCtrl="ngModel"`)にエクスポートします。 ```html @if (nameCtrl.invalid && (nameCtrl.dirty || nameCtrl.touched)) {
@if (nameCtrl.errors?.['required']) {
Name is required.
}
} ``` ## フォームの送信 1. `` 要素に `(ngSubmit)` イベントを使用します。 2. `NgForm` テンプレート参照変数(例: `[disabled]="!userForm.form.valid"`)を使用して、送信ボタンの無効状態をフォーム全体の有効性にバインドします。 ## フォームのリセット フォームをプリスティン状態(値とバリデーションフラグをクリア)にプログラムでリセットするには、`NgForm` インスタンスの `reset()` メソッドを使用します。 ```html ```