Angular 4:setValue formBuilder为空数组

bra*_*r19 8 javascript typescript angular2-formbuilder angular

我有这样的反应形式:

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]
  });
}
Run Code Online (Sandbox Code Playgroud)

以后我可以添加更多memes:

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

然后,如果我得到表格值我得到:

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.

我做错了什么?

AJT*_*T82 8

尝试了一些事情:FormArray,clear()但是以下是我发现工作的唯一解决方案实际上重置了整个数组reset(),其他选项工作,但他们离开了表单组,只是清空了值.

所以我如何使它工作,是迭代表单数组并删除循环中具有该特定索引的每个表单组:

(<FormArray>this.form.get('memes')).clear();
Run Code Online (Sandbox Code Playgroud)

如果有更好的方法,我愿意接受建议!:)


Jac*_*cki 7

尝试this.myForm.controls['myFormArray'] = this.formBuilder.array([]);在构造函数中实例化formBuilder服务.

  • 我们在 Angular 7 中仍然这样做 (2认同)
  • 如果 formArray 在像这样清除之前有一个无效的控件,那么这样做会使父窗体无效。Ng&lt;8 的最佳方法是在循环中使用removeAt。对于 Angular 8+,使用 FormArray.clear() 方法 (2认同)

小智 5

形成

this.form = this._formB.group({
    blocks: this._formB.array([])
});
Run Code Online (Sandbox Code Playgroud)

第一种方法

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

第二种方法

this.form.setControl('blocks', this._formB.array([]));
Run Code Online (Sandbox Code Playgroud)

  • 请为您的答案添加一些解释,这对OP以及在搜索类似问题时可能最终到达这里的其他人都有帮助。 (2认同)