Angular - 动态添加/删除验证器

标签 angular angular-forms angular-validation

我有一个 FormGroup 定义如下:

this.businessFormGroup: this.fb.group({
    'businessType': ['', Validators.required],
    'description': ['', Validators.compose([Validators.required, Validators.maxLength(200)])],
    'income': ['']
  })

现在,当 businessTypeOther 时,我想从 description 中删除 Validators.required 验证器。如果 businessType 不是 Other,我想添加回 Validators.required

我正在使用下面的代码动态添加/删除 Validators.required。但是,它会清除现有的 Validators.maxLength 验证器。

if(this.businessFormGroup.get('businessType').value !== 'Other'){
    this.businessFormGroup.get('description').validator = <any>Validators.compose([Validators.required]);               
} else {                
    this.businessFormGroup.get('description').clearValidators();               
}

this.businessFormGroup.get('description').updateValueAndValidity(); 

我的问题是,如何在添加/删除 required 验证器时保留现有验证器。

最佳答案

如果您使用的是 Angular 12.2 或更高版本,则可以使用 AbstractControl 方法 addValidatorsremoveValidatorshasValidatoras per the docs :

if(this.businessFormGroup.get('businessType').value !== 'Other'){
    this.businessFormGroup.get('description').addValidators(Validators.required);               
} else {                
    this.businessFormGroup.get('description').clearValidators();               
}

对于旧版本,Angular 表单有一个内置函数 setValidators()启用验证器的编程分配。但是,这将覆盖您的验证器。

对于您的示例,您可以执行以下操作:

if(this.businessFormGroup.get('businessType').value !== 'Other'){
    this.businessFormGroup.controls['description'].setValidators([Validators.required, Validators.maxLength(200)]);              
} else {                
    this.businessFormGroup.controls['description'].setValidators([Validators.maxLength(200)]);               
}
this.businessFormGroup.controls['description'].updateValueAndValidity();

重要的是要记住,通过使用此方法,您将覆盖现有的验证器,因此您将需要为要重置的控件包含所有需要/想要的验证器。

关于Angular - 动态添加/删除验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49075027/

相关文章:

javascript - Angular 服务实例化了两次?

angular - (ngx-bootstrap) 关闭以编程方式使用组件创建的模式

Angular Material 表不显示数据

angular - 如何区分多个Validators.pattern

如果值在数组中,AngularJS 输入有效

javascript - Angular 4 - 在显示验证错误时无法读取 null 的属性状态

angular - 升级到Webpack 4后,Angular Application中的InjectionToken Config否

forms - 验证父表单中的表单 Angular 2+

javascript - formGroup 需要一个 FormGroup 实例。请在我在其他表单组中创建表单组时传入一个

angular - 如何直接从 formControl 获取验证器?