コンテンツへスキップ
最初のAngularリアクティブフォームの作り方

最初のAngularリアクティブフォームの作り方

Angularリアクティブフォームの作成方法をご存知ですか?このプロセスの詳細については、このブログ記事をお読みください。詳細な手順が含まれています。詳細情報。

読者9分

Angularリアクティブフォームの作成方法をご存知ですか? Angularは箱から出して、2種類のフォームを提供します:

  1. テンプレート駆動フォーム
  2. 反応型

テンプレート駆動フォームでは、コンポーネントテンプレート上でコントロールを作成し、ngModelを使ってデータをバインドします。これらでは、コントロールやフォームオブジェクトの作成、コンポーネントクラスとテンプレート間のプッシュ・プルのコードを書く必要はありません。Angularこれらすべての作業を代わりに行ってくれます。テンプレート駆動フォームでは、コンポーネントクラスの検証コードは非常に少なく、非同期です。

Reactive Formsでは、コンポーネントクラスのオブジェクトのツリーとしてフォームコントロールを作成し、テンプレート内のネイティブフォームコントロールにバインドします。すべての検証とフォームコントロールの作成はコンポーネントクラスで記述されます。Reactive Formsでは、すべての検証やネイティブフォームの状態変更が同期しているため、コンポーネントクラスでコードを書いて観察できます。データモデルが不変で通常はデータベースにマッピングされている場合にリアクティブフォームを作成するべきです。

この2つのフォーム作成アプローチの主な違いは何ですか?リアクティブフォームではngModelやrequiredなどの指示は使いません。すべてのコントロールとその検証はコンポーネントクラスで作成します。リアクティブフォームはテストや保守が簡単なので、本記事ではFormControl、FormGroup、FormBuilderクラスを使い、検証を追加して基本的なリアクティブフォームを作成する方法を学びます。

ステップ1:リアクティブフォームモジュールの追加

リアクティブフォームの作業を始めるには、まず次のリストに示されているようにアプリモジュールにReactiveFormsModleを追加してください。

import {ReactiveFormsModule} from '@angular/forms';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule, ReactiveFormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

ステップ2:コンポーネントに必要モジュールをインポートする

次に、FormGroup、FormControl、FormArrayなどの必要なリアクティブフォームクラスをコンポーネントクラスにインポートする必要があります。これらのクラスを使ってリアクティブフォームを作成します。これらのクラスをインポートした後、コンポーネントクラスは以下の一覧のように見えるはずです。

import { Component } from '@angular/core';
import { FormGroup, FormControl, FormArray } from '@angular/forms';
@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent {
    title = 'Reactive Forms Demo';
}

コンポーネントクラスは、実装によっては上記のAppComponentとは異なる場合があります。ただし、ここではFormGroup、FormControl、FormArrayの各クラスをインポートしています。これらのクラスについて一つずつ学んでいきましょう:

ステップ3:FormControlクラスの使用

FormControlクラスは1つの個別のフォームコントロールに対応し、その値と有効性を追跡します。リアクティブフォームを作成する際には、FormControlクラスのオブジェクトを作成します。FormControlのコンストラクタは3つのパラメータを取ります:

  1. 初期データ値(null)に設定できます。
  2. 同期検証器の配列。これはオプションのパラメータです。
  3. 非同期検証器の配列。これはオプションのパラメータです。

コンポーネントクラスでは、以下の一覧のようにFormControlを作成できます。

export class AppComponent {
    email = new FormControl('');
}

同期検証や非同期検証などのオプションパラメータは渡していませんが、FormControlに検証を追加する際にこれらのパラメータを探索します。

Viewでは、以下のようにメールFormControlを使用できます:

<input [formControl]='email'
       type="text"
       placeholder="Enter Email" />
{{email.value | json}}

ご覧の通り、プロパティバインディングを使ってformControlのメールをビューの入力要素にバインドしています。

ステップ4:FormGroupクラスの使用

FormGroupはFormControlのグループです。FormGroup内に様々なFormControlをカプセル化でき、以下のAPIを提供します:

  1. 対照群や形態の検証追跡
  2. コントロール群やフォームの価値の追跡

子コントロールをプロパティとして含み、ビュー上のトップレバーフォームに対応しています。FormGroupは、子FormControlの値を集約する単一のオブジェクトと考えることができます。各フォームコントロールはFormGroupオブジェクトのプロパティです。

次のリストに示されているように、FormGroupクラスを作成できます:

loginForm = new FormGroup({
    email: new FormControl(' '),
    password: new FormControl(' ')
})

ここにログインフォームを作成しました。これはFormGroupです。メールとパスワードの2つのフォームコントロールで構成されています。次の一覧に示されているように、ビューでFormGroupを使うのは非常に簡単です。

<form [formGroup]='loginForm' novalidate class="form">
    <input formControlName='email'
           type="text"
           class="form-control"
           placeholder="Enter Email" />
    <input formControlName='password'
           type="password"
           class="form-control"
           placeholder="Enter Password" />
</form>
{{loginForm.value | json}}
{{loginForm.status | json }}

ここではプロパティバインディングを使って、FormGroupをフォームおよびフォームコントロールネームの指示とバインドし、ビュー上の特定の要素にFormControlを接続しています。

テンプレート駆動型フォームを使っている場合、ビューがずっと簡潔になっていることに気づくでしょう。元素にngModelや名前が付加されていません。値とステータスプロパティを使ってフォームの値と状態を確認できます。これでテンプレート参照変数を使ってフォームの状態や値を探す必要はなくなりました。

ステップ5:フォームの提出

フォームを提出するには、フォームに送信ボタンと呼び出す関数を追加します。フォームを以下のように修正します:

<form (ngSubmit)='loginUser()' [formGroup]='loginForm' novalidate class="form">
    <input formControlName='email' type="text" class="form-control" placeholder="Enter Email" />
    <input formControlName='password' type="password" class="form-control" placeholder="Enter Password" />
    <button class="btn btn-default">Login</button>
</form>

コンポーネントクラス では、以下の一覧のようにフォームを提出する関数を追加できます:

export class AppComponent implements OnInit {
 
    loginForm: FormGroup;
    ngOnInit() {
        this.loginForm = new FormGroup({
            email: new FormControl(null, Validators.required),
            password: new FormControl()
        });
    }
    loginUser() {
        console.log(this.loginForm.status);
        console.log(this.loginForm.value);
    }
}

ここでは、フォーム送信イベントを処理するためのloginUserという関数を追加しました。この関数内で、FormGroupオブジェクトloginFormのステータスとステータスプロパティを使って読み取ることができます。ご覧の通り、これにより個々のフォームコントロールの値を集約するオブジェクトが得られます。

Step 6: Adding validations

フォームに検証機能を追加していないことに気づいたかもしれません。まずはFormControlsに検証機能を追加しましょう。そのためには、Validatorsをインポートしてください@angular/forms:

ngOnInit() {
    this.loginForm = new FormGroup({
        email: new FormControl(null, Validators.required),
        password: new FormControl(null, [Validators.required, Validators.maxLength(8)])
    });
}

テンプレート上で、FormGroupのgetメソッドを使って特定のフォームコントロールのエラーを見つけて利用できます。以下のリストでは、メールの検証エラーを確認し、エラーdivを表示しています。

<div class="alert  alert-danger"
     *ngIf="loginForm.get('email').hasError('required') && loginForm.get('email').touched">
    Email is required
</div>

また、デフォルトで送信ボタンを無効にし、フォームが有効になったら送信を許可することもできます。これは以下のリストに示されているようにできます:

<button [disabled]='loginForm.invalid' class="btn btn-default">Login</button>

すべてを組み合わせると、リアクティブフォーム付きのテンプレートは次のようになります。

<div class="container">
    <br />
    <form (ngSubmit)='loginUser()' [formGroup]='loginForm' novalidate class="form">
        <input formControlName='email' type="text" class="form-control" placeholder="Enter Email" />
        <div class="alert  alert-danger" *ngIf="loginForm.get('email').hasError('required') && loginForm.get('email').touched">
            Email is required
        </div>
        <input formControlName='password' type="password" class="form-control" placeholder="Enter Password" />
        <div class="alert  alert-danger" *ngIf=" !loginForm.get('password').valid && loginForm.get('email').touched">
            Password is required and should less than 10 characters
        </div>
        <button [disabled]='loginForm.invalid' class="btn btn-default">Login</button>
    </form>
</div>

構成クラスは以下のリストに示されます。

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, FormArray, Validators } from '@angular/forms';
@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
 
    loginForm: FormGroup;
 
    ngOnInit() {
 
        this.loginForm = new FormGroup({
            email: new FormControl(null, [Validators.required, Validators.minLength(4)]),
            password: new FormControl(null, [Validators.required, Validators.maxLength(8)])
        });
    }
    loginUser() {
        console.log(this.loginForm.status);
        console.log(this.loginForm.value);
    }
}

Step 7: Using FormBuilder

FormBuilderはFormGroupとFormControlの構文を簡素化するために使われます。これはフォームが長くなるときに非常に役立ちます。例えば;loginFormをFormBuilderにリファクタリングします。そのためには、まず@angular/formsからFormBuilderをインポートしてください。そして以下のリストに示すようにコンポーネントに注入します:

constructor(private fb : FormBuilder){}

FormBuilderを使って、以下のリストに示すようなリアクティブフォームを作成できます。ご覧の通り、構文が簡略化されています:

this.loginForm = this.fb.group({
    email: [null, [Validators.required, Validators.minLength(4)]],
    password: [null, [Validators.required, Validators.maxLength(8)]]
 
})

テンプレートはFormBuilderとFormControlの両方のクラスで同じになります。すべてを合わせると、FormBuilderを使ってリアクティブフォームを作成するコンポーネントは次のようになります。

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, FormArray, Validators, FormBuilder } from '@angular/forms';
@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
 
    loginForm: FormGroup;
 
    constructor(private fb: FormBuilder) {
 
    }
    ngOnInit() {
 
        this.loginForm = this.fb.group({
            email: [null, [Validators.required, Validators.minLength(4)]],
            password: [null, [Validators.required, Validators.maxLength(8)]]
 
        })
    }
 
    loginUser() {
        console.log(this.loginForm.status);
        console.log(this.loginForm.value);
    }
}

この投稿が好きですか?

そして、これで完了です!この投稿が気に入ったら、共有してください。さらに、Infragistics Ignite UI for Angular Componentsをまだチェックしていない場合は、必ずチェックしてください。彼らは30 +の材料ベースのAngularコンポーネントを持っており、高速なWebアプリをより速くコーディングするのに役立ちます。

ダウンロードIgnite UI for Angular- 無料トライアル!

デモを予約