Angular 在反应式表单中设置和更新表单数组的验证

Angular 在反应式表单中设置和更新表单数组的验证,angular,angular-reactive-forms,Angular,Angular Reactive Forms,在angular 4中,我创建了一个表单,它有一个如下的表单数组 this.formBuilder.group({ name: ['', [Validators.required, Validators.minLength(3)]], required:false, selectType: ['', [Validators.required]], items: this.formBuilder.array([this.buildItems()]) }) ... buildIte

在angular 4中,我创建了一个表单,它有一个如下的表单数组

this.formBuilder.group({
  name: ['', [Validators.required, Validators.minLength(3)]],
  required:false,
  selectType: ['', [Validators.required]],
  items: this.formBuilder.array([this.buildItems()])
})

...
buildItems() {
  return this.formBuilder.group({ 
     name: ['', [Validators.required]] 
});
这将生成表单,我可以在此表单中添加或删除等,以及表单中的项目。 我现在试图实现的是,当
selectType
等于
custom
(设置为表单上的单选按钮值)时,我需要更改项目
name
的验证并清除其验证要求

我已经在另一张表格上做了设置和更新,就像这样

  changeValidation() {
      if(condition){
          this.form.get('name').setValidators(Validators.required);
          this.form.get('name').updateValueAndValidity();
      }
  }
这很好,但是我不知道如何更新表单数组上的验证。我试过了

this.items.clearValidators();
this.items.updateValueAndValidity();
我没有得到任何错误,但它也不工作。哪种类型是有意义的,因为我不是针对特定的
FormControl
但是当
FormControls
是数组时,如何指定特定的
FormControl

当FormControls为时,如何指定特定的FormControls 阵列

您必须使用所述的
at
方法来获得单个控件:

this.items.at(0).clearValidators();
如果要清除
name
控件的验证器,请执行以下操作:

 this.items.at(0).controls.name.clearValidators();
如果您想删除每个控件的验证器,那么FormArray似乎不提供这样的API。您必须迭代表单数组控件并删除每个控件的验证程序:

this.items.controls.forEach(c => c.clearValidators());

对于索引0处的
formControl
,不会进行更新。我想更新整个表单。我想清除
this.items中
name:[''[validators.required]]]
的验证器,然后像
this.items.at(0.controls.name.clearValidators(),我已经更新了密码。这对我不起作用。。我必须运行.controls[0].updateValueAndValidity();对于以其他方式进行的每个更改,验证并不总是得到更新。不需要循环,只需执行
this.items.at(i).get('control_name').clearValidators()