Javascript 角度4:setValue formBuilder空数组
我有这样的反应形式:Javascript 角度4:setValue formBuilder空数组,javascript,angular,typescript,angular2-formbuilder,Javascript,Angular,Typescript,Angular2 Formbuilder,我有这样的反应形式: constructor(...){ this.form = this.formBuilder.group({ name: ['', Validators.compose([Validators.required, Validators.maxLength(50)])], memes: this.formBuilder.array([ this.initMemes('TrollFace') ]) }); } initMemes (
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]
});
}
稍后我可以添加更多的模因
:
addMemes () {
const control = <FormArray>this.form.controls['memes'];
control.push(this.initMemes('anyName'));
}
addMemes(){
const control=this.form.controls['memes'];
control.push(this.initMemes('anyName'));
}
然后,如果我得到表单值,我得到:
this.form.controls['memes'].value
-这里是数组
但是有一种情况,当我需要thisthis.form.controls['memes'].value
设置为空数组时,怎么办
如果我这样设置:
this.form.controls['memes'].setValue([])
我收到错误:必须在索引0处为表单控件提供一个值。
我做错了什么?编辑:
从较新版本开始,Angular现在支持使用clear()
清除FormArray
:
如果有更好的方法,我愿意听取建议!:) 试试
this.myForm.controls['myFormArray']=this.formBuilder.array([])在构造函数中实例化formBuilder服务的代码> 我遇到了一个类似的问题,在更新表单后,我会遇到上述错误,经过一系列调查和失败的实验后,我发现this.myForm.updateValue和validity
最终成功了。表单
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([]));
请为您的答案添加一些解释,这有助于OP以及其他可能在搜索类似问题时出现在这里的人。我认为应该是control.controls.removeAt(i)。因为console.log(control)有一个名为controls的数组,否则会出现错误“无法读取null的属性'enabled'。谢谢。这是整个页面中唯一有效的解决方案。您可以只执行control.clear()
,而不是for loop
。对于阅读本文的任何人:在阅读了有关FormArray的教程后,我遇到了这个错误。解决方案很简单,只需使用一对空方括号[]初始化FormArray:this.formBuilder.array([])。我不知道那里的函数调用应该做什么,我只知道它给出了那个错误。我们仍然这样做,这样做会使父窗体无效,如果formArray在像这样清除它之前有一个无效的控件。Ng的最佳方法
let fArray = <FormArray>this.form.controls['blocks'];
while (fArray.length !== 0) {
fArray.removeAt(0)
}
this.form.setControl('blocks', this._formB.array([]));