2016-01-27 17 views
69

これは私を馬鹿にしています。私は銃の下にいるので、もう一日過ごす余裕はありません。FormBuilderコントロールの値を手動で設定

コンポーネント内で制御値( 'dept')を手動で設定しようとしていて、正しく機能しない場合でも、新しい値のログが正しくコンソールに記録されます。今

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をログアウト時にフィールドがまだある:これは、選択したDEPTを受け取るイベントハンドラがある

initForm() { 
    this.form = this.fb.group({ 
    'name': ['', Validators.required], 
    'dept': ['', Validators.required], 
    'description': ['', Validators.required], 
    }); 
} 

:ここ

はFormBuilderインスタンスでありますブランク!私は他のpplの使用 updateValue()を見てきましたが、これはbeta.1であり、コントロールを呼び出すための有効なメソッドではありません。

私はまた:(なしの成功とupdateValueAndValidity()を呼び出そうとしています。

は、私は、フォームの残りの部分が、そのカスタムディレクティブ/コンポーネントでやっているように私は、フォーム要素に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> 
+0

を使用する@使用することができ、私は似たような状況に遭遇していたFormControl

(<Control>this.form.controls['dept']).updateValue(selected.id)

import { FormControl } from '@angular/forms'; (<FormControl>this.form.controls['dept']).setValue(selected.id)); 

を使用して、シナリオは値がhttp.getサブスクライブ中に設定したとフォームの値をロードしますが、値の行を最初に実行するように設定すると、サブスクライブは実際には非同期として後で実行されます。サブスクライブの値を設定すると、そのセットが確実に確認されます。 my2cents! – HydTechie

答えて

108

更新日:19/03/2017

this.form.controls['dept'].setValue(selected.id); 

OLD:今のところ、我々は型キャストを行うことを余儀なくされている

(<Control>this.form.controls['dept']).updateValue(selected.id) 

それほどエレガントではないと私は同意します。これが将来のバージョンで改善されることを願っています。

+6

これはうまく動作します。また、検証をクリアする必要があります: '( this.form.controls ['dept'])setErrors(null)' –

+3

または 'this.form.get( 'dept')。setValue(selected.id)': ) – developer033

7

:詳細については

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); 
} 

を、あなたはSに関する対応するJSドキュメントを見ている可能性がありupdateValueメソッドのecondパラメータ:https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model.ts#L269

はそれHEPSあなたを願って、 ティエリー

+0

返信いただきありがとうございます - しかし、updateValueはangle2 beta.1で有効なメソッドではないようです - あなたはどのバージョンを使用していますか? –

+1

Typescriptは次のエラーを出します: 'エラーTS2339: 'updateValue'プロパティが 'AbstractControl'タイプに存在しません。そのコンポーネントでは、フォームは 'ControlGroup'のタイプです。 もし私が 'new control()'を使って個別に作成すると、これはうまくいくでしょう –

+0

はい、 'Control'クラスのメソッドです... –

71

Angular 2 Final(RC5 +)には、フォーム値を更新するための新しいAPIがあります。 patchValue() APIメソッドは、我々は唯一のフィールドの一部を指定する必要が部分的にフォームの更新をサポートしています。

this.form.patchValue({id: selected.id}) 

すべてのフォームフィールドを持つオブジェクトが必要setValue() APIの方法もあります。フィールドがない場合、エラーが発生します。

+6

これを追加するには、 'updateValue'(Filocheの受け入れられた回答から)は' setValue'のために廃止されました – superjos

+2

ここには[official pull request](https://github.com/angular/angular/ pull/10537)と 'updateValue()'を非難し、 'patchValue'と' setValue'を導入する根拠について説明します。 – TheBrockEllis

9

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

3
let cloneObj = Object.assign({}, this.form.getRawValue(), someClass); 
    this.form.complexForm.patchValue(cloneObj); 
をリセットする必要はありません3210

各フィールドを手動で設定する必要がない場合。

1

@ Filoche's Angular 2最新の解決策。また、あなたがAngularUniversityのsolutionpatchValue

関連する問題