Add/remove 对动态创建的输入的反应式表单验证器

Add/remove reactive form validators to dynamically created inputs

我在 Angular 4 中创建了一个表单,它允许用户单击表单中的“添加”或“删除”按钮将 add/remove 个字段添加到表单中。我使用 ngFor 从数组创建屏幕上的 html 输入(通过添加函数放大,或通过删除函数缩小)。

在 html 模板中,我可以在表单 formControlName="control{{index}}" 中添加 formControlName 以确保每个新输入都有一个表单控件。

但是我如何为这些输入动态地添加和删除验证器

你能看看这个文档吗https://angular.io/api/forms/AbstractControl#updateValueAndValidity,

对于 add/remove 控件,您可以使用这些方法

addControl/removeControl

对于值和验证器,您可以像这样使用

 this.form.controls['test_control'].setValidators([Validators.required])
 this.form.controls['test_control'].updateValueAndValidity()

来源Link

对于 Angular 11 使用 setValidators()updateValueAndValidity() 方法

  setRequired() {
    this.profileForm.controls.firstName.setValidators([Validators.required]);
    this.profileForm.controls.firstName.updateValueAndValidity();
  }

  unsetRequired() {
    this.profileForm.controls.firstName.setValidators(null);
    this.profileForm.controls.firstName.updateValueAndValidity();
  }

Angular 13. 它对我有用...

OnInit 函数:

ngOnInit() {
    this.form.get('type')?.valueChanges.subscribe((val) => {
      if (val) {
        switch (val) {
          case 1:
            this.removeValidators(['comment', 'id']);
            this.addValidators(['desc', 'options']);
            break;
          case 2:
            this.removeValidators(['desc', 'options', 'comment']);
            this.addValidators(['id']);
            break;
        }
      }
    });
}

函数(Add/Remove 验证器):

addValidators(controls : string[]){
    controls.forEach(c => {
        if(['desc','comment'].includes(c)){
            this.form.get(c)?.setValidators([Validators.required,Validators.maxLength(250)]);
        } else {
            this.form.get(c)?.setValidators(Validators.required);
        }
        this.form.get(c)?.updateValueAndValidity();
    });
}

removeValidators(controls : string[]){
    controls.forEach(c => {
        this.form.get(c)?.clearValidators();
        this.form.get(c)?.updateValueAndValidity();
    });
}