使用clearValidators()后,所需的验证器仍处于活动状态

时间:2019-02-01 03:13:06

标签: angular angular6 angular-reactive-forms angular-validation reactive-forms

我有一个行列表,每个行都有一些选择,输入和一个看起来像这样的复选框

<mat-checkbox [(ngModel)]="chargeApply[charge]" [ngModelOptions]="{standalone: true}"
            (change)="setChargeValidators(charge, $event.checked)"></mat-checkbox> 

setChargeValidators的目的是为选中/未选中的行添加/删除验证器,这就是该功能(有很多可以正常工作的东西,我并没有解释该功能,重要的部分是当选择为false时清除验证器,并且CELL_VALIDATION是包含Validators.required的数组):

setChargeValidators(charge: string, selected: boolean) {
if (selected) {
  this.chargesSelected = true;
  this.chargesForm.controls[charge + '20'].setValidators(CELL_VALIDATION);
  this.chargesForm.controls[charge + '40'].setValidators(CELL_VALIDATION);
  this.chargesForm.controls[charge + '40hc'].setValidators(CELL_VALIDATION);
  this.chargesForm.controls[charge + 'Currency'].setValidators(Validators.required);
  this.chargesForm.controls[charge + 'Unit'].setValidators(Validators.required);
} else {
  const controlNames = ['20', '40', '40hc', 'Currency', 'Unit'];
  for (let name of controlNames) {
    if (name !== 'Currency' ) {
      this.chargesForm.controls[charge + name].reset();
    }
    this.chargesForm.controls[charge + name].clearValidators();
  }

  for (let chargeName in this.chargeApply) {
    if (this.chargeApply[chargeName]) {
      return;
    }
  }
  this.chargesSelected = false;
}

this.updateForm(charge);}

UpdateForm看起来像这样

updateForm(charge) {
const controlNames = ['20', '40', '40hc', 'Currency', 'Unit'];
for (let name of controlNames) {
  this.chargesForm.controls[charge + name].updateValueAndValidity();
  // debugger
}

}

但是,当我取消选择一行时,该行的所有FormControl都有

  

错误:{required:true}

除Validators.required外,似乎所有验证程序都在清除中。我已经尝试过了

  

this.chargesForm.controls [charge + name] .clearAsyncValidators();

除clearValidators()外,没有任何效果(这很有意义,因为我没有设置任何异步验证)。我也尝试过This solution,但没有运气。

谢谢您的时间。

0 个答案:

没有答案