Angular 7 中的动态验证: enable() 和 setValidators 取决于更改触发的标志

Posted

技术标签:

【中文标题】Angular 7 中的动态验证: enable() 和 setValidators 取决于更改触发的标志【英文标题】:Dynamic Validations in Angular 7: enable() & setValidators depending on flags triggered by changes 【发布时间】:2019-06-28 06:43:54 【问题描述】:

我的上一个 Angular 项目是很久以前的事了,同时我也在使用 VueJS。现在我回来了,并在 Angular 7 中实现了一个带有一些条件字段的响应式表单。

我下面的解决方案有效,我可以启用字段或设置验证器依赖于标志。但不知何故我不喜欢这个解决方案,它太长而且不直观。没有人能凭直觉知道,您必须禁用某个字段才能禁用验证器。 Angular/TypeScript 专家能否帮助我优化该代码或以正确的方式进行

onChangeType(scope: string) 
    console.log(scope);
    this.myForm.get('riskType').disable();
    this.myForm.get('chancheType').disable();

    if (scope === 'local') 
    this.flags.isScopeLocal = true;
    this.flags.isScopeTemplate = false;
    this.flags.isScopeGlobal = false;
    this.myForm.get('chancheType').enable();
    this.myForm.get('chancheType').setValidators(Validators.required);
     else if (scope === 'template') 
    this.flags.isScopeTemplate = true;
    this.flags.isScopeLocal = false;
    this.flags.isScopeGlobal = false;
    this.myForm.get('riskType').enable();
    this.myForm.get('riskType').setValidators(Validators.required);
     else 
    // global
    this.flags.isScopeLocal = false;
    this.flags.isScopeTemplate = false;
    this.flags.isScopeGlobal = true;
    this.myForm.get('riskType').disable();
    this.myForm.get('chancheType').disable();
    
 

简短说明:如果范围是本地或模板,则会有一个新的必填字段。如果范围是全局的,则此字段消失,其验证器将被停用。

【问题讨论】:

如果控件未启用,则不检查验证(例如,禁用所有输入,表单有效)。对于禁用控件,您不能使用 [disabled]="..." 或 [attr.disabled],但可以使用指令 ***.com/questions/47937639/… 谢谢@Eliseo,但这不是我的问题,.. 【参考方案1】:

使用指令How to make a disabled reactive form Editable in Angular2补充我的评论

孤独的是,您无需使用 setValidators 更改验证器,并且该指令是启用/禁用控件的人。我认为更“可读”

<input formControlName="riskType" [enabledControl]="scope=='local'">
<input formControlName="chancheType" [enabledControl]="scope=='template'">

myForm=this.fb.group(
     riskType:['',Validators.required],
     cacheType:['',Validators.required],

)

【讨论】:

AngularMaterial 的大问题:Can't bind to 'enabledControl' since it isn't a known property of 'mat-select'. Lonely,您需要在 main.ts 中导入指令,更多,请考虑该指令仅应用 NgControl(一个带有 [(ngModel)] 的输入或一个带有 FromControl 或 FormControlName 的输入) .见stackblitz.com/edit/…。真的,如果你使用材料,你可以直接使用属性[禁用]

以上是关于Angular 7 中的动态验证: enable() 和 setValidators 取决于更改触发的标志的主要内容,如果未能解决你的问题,请参考以下文章

angular - 指令中表单元素之间动态变化的验证要求

angular 7 反应式表单:为表单中的每个输入字段动态添加/删除输入字段

Angular 2 FormGroup 添加验证器动态

Angular 和 Asp.Net Core - 启用 2 因素身份验证

使用自定义验证和动态值的 Angular 表单

自定义 Angular 4 验证器取决于动态值