2017-05-31 18 views
6

は、私がこのような反応性の形式があります。角度4:setValueのformBuilder空の配列

constructor(...){ 
    this.form = this.formBuilder.group({ 
    name: ['', Validators.compose([Validators.required, Validators.maxLength(50)])], 
    memes: this.formBuilder.array([ 
     this.initMemes('TrollFace') 
    ]) 
    }); 
} 

initMemes (name?) { 
    return this.formBuilder.group({ 
    id: [''], name: [name] 
    }); 
} 

後、私は追加することができますが、いくつかのより多くのmemes

addMemes() { 
    const control = <FormArray>this.form.controls['memes']; 
    control.push(this.initMemes('anyName')); 
} 

と私はフォームの値を取得する場合、私は得る:

this.form.controls['memes'].value - ここに私は配列を持っています

しかし、私はこれを必要とする場合がありますthis.form.controls['memes'].valueを空の配列に設定するにはどうしたらよいですか?私は間違って何をすべきかMust supply a value for form control at index: 0.

:私はエラーを得た

this.form.controls['memes'].setValue([])

は、私はそれをこのように設定した場合は? setControl()reset()が、以下は私が実際に[]に配列全体をリセットすることを仕事に見つけた唯一の解決策だった、他のオプションが働いていたが、彼らは場所にformgroupsを残し、単に値を空に:

答えて

5

は、いくつかのことをしようとしました。

私はそれが動作するようになったどのように、フォームの配列を反復処理し、ループ内でその特定のインデックスを持つ各フォームグループを削除することでした:

const control = <FormArray>this.form.controls['memes']; 

for(let i = control.length-1; i >= 0; i--) { 
    control.removeAt(i) 
} 

良い方法があれば、私はのために開いています提案! :)

+0

は、私はそれがcontrol.controls.removeAt(i)をすべきだと思います。 console.log(control)には名前コントロールを持つ配列があるので、そうでないと "nullのプロパティ 'enabled'を読み取ることができません。 – Jassi

3

this.myForm.controls['myFormArray'] = this.formBuilder.array([]);あなたのコンストラクタでインスタンス化されたformBuilderサービスを試してみてください。

+0

これは角度4で私のために働いた – FireDragon

1

私は、私のフォームを更新した後にエラーが発生すると私は同様の問題を抱えていました。そして、調査と実験に失敗した後、私はthis.myForm.updateValueAndValidityが最後にそのトリックをしたことがわかりました。

1

FORM

this.form = this._formB.group({ 
    blocks: this._formB.array([]) 
}); 

第一の方法

let fArray = <FormArray>this.form.controls['blocks']; 
while (fArray.length !== 0) { 
    fArray.removeAt(0) 
} 

第二の方法

this.form.setControl('blocks', this._formB.array([])); 
+0

あなたの答えにいくつかの説明を追加してください、これは同様の問題を捜している間にここに来るかもしれない他の人と同様にOPに役立ちます。 – FilipRistic