を使用している場合はFormBuilder
、@ dfsqの回答を参照してください。
を使用していない場合FormBuilder
、変更を通知するには2つの方法があります。
方法1
質問のコメントで説明したように、各入力要素でイベントバインディングを使用します。テンプレートに追加:
<input type="text" class="form-control" required [ngModel]="model.first_name"
(ngModelChange)="doSomething($event)">
次に、コンポーネントで:
doSomething(newValue) {
model.first_name = newValue;
console.log(newValue)
}
フォームのページはここでは関係ありngModelに関するいくつかの追加情報があります。
ngModelChange
ありません<input>
要素イベント。これは実際にはNgModel
ディレクティブのイベントプロパティです。Angularはフォーム[(x)]
でバインディングターゲットを見つけると、x
ディレクティブがx
入力プロパティとxChange
出力プロパティを持つことを期待します。
もう1つの奇妙な点は、テンプレート式ですmodel.name = $event
。$event
DOMイベントからのオブジェクトを見るのに慣れています。ngModelChangeプロパティはDOMイベントを生成しません。これEventEmitter
は、起動時に入力ボックスの値を返すAngular プロパティです。
私たちはほとんど常に好み[(ngModel)]
ます。キーストロークのデバウンスやスロットルなどのイベント処理で特別なことをする必要がある場合は、バインディングを分割することがあります。
あなたの場合、何か特別なことをしたいと思います。
方法2
ローカルテンプレート変数を定義し、それをに設定しngForm
ます。
入力要素でngControlを使用します。
@ViewChildを使用してフォームのNgFormディレクティブへの参照を取得し、変更のためにNgFormのControlGroupをサブスクライブします。
<form #myForm="ngForm" (ngSubmit)="onSubmit()">
....
<input type="text" ngControl="firstName" class="form-control"
required [(ngModel)]="model.first_name">
...
<input type="text" ngControl="lastName" class="form-control"
required [(ngModel)]="model.last_name">
class MyForm {
@ViewChild('myForm') form;
...
ngAfterViewInit() {
console.log(this.form)
this.form.control.valueChanges
.subscribe(values => this.doSomething(values));
}
doSomething(values) {
console.log(values);
}
}
plunker
方法2の詳細については、Savkinのビデオを参照してください。
valueChanges
オブザーバブルで何ができるかについての詳細は、@ Thierryの回答も参照してください(変更を処理する前にデバウンス/ビットを待機するなど)。