Angular2 ngModelとフォームの関係
Angular2におけるngModel
とform
タグの関係について
日本語解説
Angular2において、ngModel
指令をform
タグ内で使用する場合には、以下のいずれかを行う必要があります。
name属性を設定する
ngModel
がバインドする入力要素(例えば、input
、textarea
)に、name
属性を設定します。- この
name
属性の値は、フォームのモデルオブジェクトのプロパティ名と一致させる必要があります。
formタグにname属性を設定する
form
タグ自体に、name
属性を設定します。- この場合、
ngModel
がバインドする入力要素は、自動的にフォームのモデルオブジェクトに追加されます。
理由
Angular2は、フォームの入力要素とモデルオブジェクトを結びつけるために、ngModel
指令を使用します。この際に、Angular2はname
属性を使用して、どのモデルオブジェクトのプロパティにバインドするかを決定します。
もしname
属性が設定されていない場合、Angular2はフォームのモデルオブジェクトにバインドするべきプロパティを特定できず、エラーが発生します。
例
<form [formGroup]="myForm">
<input type="text" formControlName="firstName">
<input type="text" ngModel name="lastName">
</form>
上記の例では、最初のinput
要素はformControlName
を使用して、myForm
というフォームグループのfirstName
プロパティにバインドしています。一方、2番目のinput
要素はngModel
とname
属性を使用して、フォームのモデルオブジェクトのlastName
プロパティにバインドしています。
Angular2におけるngModel
とフォームの例
ngModel
とname
属性の例
<form [formGroup]="myForm">
<input type="text" formControlName="firstName">
<input type="text" ngModel name="lastName">
</form>
2番目のinput要素
ngModel
を使用して、フォームのモデルオブジェクトのlastName
プロパティにバインドしています。name
属性が設定されているため、Angular2は自動的にフォームのモデルオブジェクトに追加します。
formControlName
を使用して、myForm
というフォームグループのfirstName
プロパティにバインドしています。formControlName
は、ReactiveFormsModule
で提供される指令で、フォームの入力要素とモデルオブジェクトを結びつけるためのより柔軟な方法です。
ngModel
とform
タグの例
<form #myForm="ngForm">
<input type="text" ngModel name="firstName">
<input type="text" ngModel name="lastName">
</form>
- この例では、フォームのモデルオブジェクトは自動的に作成され、
myForm.value
プロパティにアクセスすることで取得できます。 - 2つの
input
要素はそれぞれ、ngModel
とname
属性を使用して、フォームのモデルオブジェクトのfirstName
とlastName
プロパティにバインドしています。 form
タグに#myForm="ngForm"
を設定することで、フォーム全体をテンプレート変数myForm
にバインドしています。
ReactiveFormsModuleを使用する
ReactiveFormsModule
は、Angular2のフォームをより柔軟に管理するためのモジュールです。このモジュールを使用すると、フォームのモデルオブジェクトをプログラム的に作成し、入力要素をそのモデルオブジェクトにバインドすることができます。
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'app-my-form',
templateUrl: './my-form.component.html',
styleUrls: ['./my-form.compo nent.css']
})
export class MyFormComponent implements OnInit {
myForm: FormGroup;
ngOnInit() {
this.myForm = new FormGroup ({
firstName: new FormControl(''),
lastName: new FormControl('')
});
}
}
<form [formGroup]="myForm">
<input type="text" formControlName="firstName">
<input type="text" formControlName="lastName">
</form>
formControlName
指令を使用して、入力要素をFormGroup
のFormControl
にバインドします。ReactiveFormsModule
を使用して、FormGroup
とFormControl
を作成します。
カスタムフォームディレクティブを作成する
カスタムフォームディレクティブを作成することで、ngModel
の代替として入力要素をフォームのモデルオブジェクトにバインドすることができます。
import { Directive, Input, HostListener } from '@angular/core';
@Directive({
selector: '[myCustomForm]'
})
export class MyCustomFormDirective {
@Input() myCustomForm: any;
@HostListener('input', ['$event']) onInput(event: Event) {
this.myCustomForm = event.target.value;
}
}
<form>
<input type="text" myCustomForm="firstName">
<input type="text" myCustomForm="lastName">
</form>
- カスタムディレクティブを作成し、
@Input
プロパティと@HostListener
を使用して、入力要素の値をフォームのモデルオブジェクトにバインドします。
angular angular-forms