これは私の実を動かしています、私は銃の下にいます、そしてこれにもう一日過ごす余裕はありません。
コンポーネント内で手動で制御値( 'dept')を設定しようとしていますが、それが機能していません - 新しい値でも正しくコンソールに記録されます。
これがFormBuilderインスタンスです。
initForm() {
this.form = this.fb.group({
'name': ['', Validators.required],
'dept': ['', Validators.required],
'description': ['', Validators.required],
});
}
これは、選択した部門を受け取るイベントハンドラです。
deptSelected(selected: { id: string; text: string }) {
console.log(selected) // Shows proper selection!
// This is how I am trying to set the value
this.form.controls['dept'].value = selected.id;
}
今すぐフォームが送信され、そして私がthis.form
をログアウトするとき、フィールドはまだ空白です!私は他のpplがupdateValue()
を使っているのを見ました、しかしこれはbeta.1であり、私はそれをコントロールを呼び出すための有効なメソッドとして見ません。
私は成功しないでupdateValueAndValidity()
を呼び出そうとしました:(。
私はform要素にngControl="dept"
を使うことにします。これは私がフォームの残りの部分で行っているのと同じですが、それはカスタムディレクティブ/コンポーネントです。
<ng-select
[data]="dept"
[multiple]="false"
[items]="depts"
(selected)="deptSelected($event)" <!-- This is how the value gets to me -->
[placeholder]="'No Dept Selected'"></ng-select>
更新:19/03/2017
this.form.controls['dept'].setValue(selected.id);
古い:
今のところ我々は型キャストをすることを余儀なくされています:
(<Control>this.form.controls['dept']).updateValue(selected.id)
それほどエレガントではないと思います。これが将来のバージョンで改善されることを願っています。
Angular 2 Final(RC5 +)には、フォームの値を更新するための新しいAPIがあります。 patchValue()
APIメソッドは部分的なフォームの更新をサポートしています。ここではいくつかのフィールドを指定するだけで済みます。
this.form.patchValue({id: selected.id})
すべてのフォームフィールドを持つオブジェクトを必要とするsetValue()
APIメソッドもあります。不足しているフィールドがあると、エラーが発生します。
Aangular 2 finalがAPIを更新しました。彼らはこれに多くの方法を追加しました。
コントローラからフォームコントロールを更新するには、これを行います。
this.form.controls['dept'].setValue(selected.id);
this.form.controls['dept'].patchValue(selected.id);
エラーをリセットする必要はありません
参考文献
https://angular.io/docs/ts/latest/api/forms/index/FormControl-class.html
https://toddmotto.com/angular-2-form-controls-patch-value-set-value
あなたはこれを試すことができます:
deptSelected(selected: { id: string; text: string }) {
console.log(selected) // Shows proper selection!
// This is how I am trying to set the value
this.form.controls['dept'].updateValue(selected.id);
}
詳細については、updateValue
メソッドの2番目のパラメータに関する対応するJS Docを参照してください。 https://github.com/angular/angular/blob/master/modules/angular 2/src/common/forms) /model.ts#L269 。
リアクティブフォームコントロールの値を更新するために、次の方法が使用できます。次の方法のどれでもあなたの必要性に適するでしょう。
setValue()を使ったメソッド
this.form.get("dept").setValue(selected.id);
this.form.controls["dept"].setValue(selected.id);
patchValue()を使ったメソッド
this.form.get("dept").patchValue(selected.id);
this.form.controls['dept'].patchValue(selected.id);
this.form.patchValue({"dept": selected.id});
最後の方法はフォーム内のすべてのコントロールをループ処理するため、単一のコントロールを更新するときには好ましくない
イベントハンドラ内で任意のメソッドを使用できます
deptSelected(selected: { id: string; text: string }) {
// any of the above method can be added here
}
必要に応じて、フォームグループ内の複数のコントロールを更新することができます。
this.form.patchValue({"dept": selected.id, "description":"description value"});
これらのどれも私のために働きませんでした。私がしなければなりませんでした:
this.myForm.get('myVal').setValue(val);
let cloneObj = Object.assign({}, this.form.getRawValue(), someClass);
this.form.complexForm.patchValue(cloneObj);
手動で各フィールドを設定したくない場合。
@ FilocheのAngular 2アップデートソリューション。 FormControl
を使用する
(<Control>this.form.controls['dept']).updateValue(selected.id)
import { FormControl } from '@angular/forms';
(<FormControl>this.form.controls['dept']).setValue(selected.id));
あるいは、@ AngularUniversityの solution を使用することもできますpatchValue
ヒント: setValue
を使用しているがフォームの every プロパティを指定していない場合はエラーが発生します。
Must supply a value for form control with name: 'stateOrProvince'.
そのためpatchValue
を使いたくなるかもしれませんが、フォーム全体を更新しようとしている場合、これは危険になる可能性があります。私はaddress
を持っていますが、stateOrProvince
またはstateCd
は、米国であるか世界中であるかによって異なります。
代わりに、あなたはこのように更新することができます - それはデフォルトとしてnullを使うでしょう:
this.form.setValue( { stateOrProvince: null, stateCd: null, ...address } );