2017-05-31 32 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設置爲空數組,怎麼可能做?

如果我設置這種方式:

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

我得到錯誤:Must supply a value for form control at index: 0.

什麼,我做錯了什麼?

回答

5

試了幾件事情:reset()setControl(),但下面是我找到的工作,實際上整個數組重置爲[]唯一的解決方案,其他選擇的工作,但他們留下的formgroups到位,只是空值。

所以,我怎麼得到它的工作,是要遍歷數組形式,並刪除每個窗體組與環中的特定指數:

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)有一個帶有名稱控件的數組,否則會出現錯誤「Can not read property'enabled'null'」。 – Jassi

3

嘗試this.myForm.controls['myFormArray'] = this.formBuilder.array([]);與formBuilder服務在您的構造函數中實例化。

+0

Angular 4中的這個工作對我有幫助0 – FireDragon

1

我有一個類似的問題,更新我的表單後,我會說錯誤,經過一堆調查和失敗的實驗後,我發現this.myForm.updateValueAndValidity終於做到了。

1

FORM

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

1日法

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

第二個方法

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

請給你的答案添加一些解釋,這有助於OP以及其他在搜索類似問題時最終會在這裏結束的人。 – FilipRistic