← Angular コース
38. 双方向バインディング — [(ngModel)] で入力と同期する
input要素の入力内容とクラスのプロパティを常に同じ値に保つには、双方向バインディングを使います。FormsModule をコンポーネントの imports に追加し、<input [(ngModel)]="name"> と書くだけで、入力すればプロパティが更新され、クラス側で値を変えれば入力欄の表示も変わります。
実務では検索ボックスや設定画面など、入力値をすぐクラス側で使いたい場面で活躍します。[( )] という記法は「[ ]で値を流し込む」と「( )で変更を受け取る」の合体で、形がバナナを箱に入れた姿に見えることから「バナナ・イン・ア・ボックス」という覚え方が定番です。
FormsModule を imports に入れ忘れると ngModel が認識されずエラーになるので注意しましょう。また、以前学んだ model() は自作コンポーネント同士(親子間)の双方向同期、[(ngModel)] はinputなどのフォーム要素との同期、と対象が違う点も区別しておくと混乱しません。
サンプルコード(フレームワーク環境が必要なため表示のみ)
import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-name-editor',
// ngModel を使うには FormsModule を imports に追加する
imports: [FormsModule],
// [( )] = [ ]の流し込み + ( )の受け取り。入力とプロパティが同期する
template:
'<input [(ngModel)]="name" placeholder="名前">' +
'<p>こんにちは、{{ name }}さん</p>',
})
export class NameEditorComponent {
name = '田中'; // 入力欄に打つと即座に更新される
}
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗