Angular 2自定义验证器,用于检查何时需要两个字段之一

编程入门 行业动态 更新时间:2024-10-27 02:23:36
本文介绍了Angular 2自定义验证器,用于检查何时需要两个字段之一的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试实现自定义验证器功能,以检查是否输入了电话号码(家用电话和移动电话).我想在两个字段都被触摸并且都没有有效值时在两个字段上显示错误消息,由于某些原因,我的代码无法按预期工作.请帮我做这件事情. -谢谢! 这是stackblitz链接 stackblitz/edit/angular-ve5ctu

I am trying to implement a custom validator function to check either of the Phone numbers(Home Phone and Mobile) are entered or not. I want to show the error message on both the fields when they are both touched and not have the valid value, for some reason my code is not working as anticipated. Please help me with this piece. -Thanks! Here is the stackblitz link stackblitz/edit/angular-ve5ctu

createFormGroup() { this.myForm = this.fb.group({ mobile : new FormControl('', [this.atLeastOnePhoneRequired]), homePhone : new FormControl('', [this.atLeastOnePhoneRequired]) }); } atLeastOnePhoneRequired(control : AbstractControl) : {[s:string ]: boolean} { const group = control.parent; if (group) { if(group.controls['mobile'].value || group.controls['homePhone'].value) { return; } } let errorObj = {'error': false}; return errorObj; }

推荐答案

而不是在每个formControl上标记验证器,而是为电话号码创建一个嵌套组,然后将验证器应用于该组.在此示例中,我将仅在整个表单上应用验证器.

Instead of marking the validator on each formControl, make a nested group for the phone numbers and apply the validator to that group. In this sample I'll just apply the validator on the whole form.

同样,当应用验证器时,我们需要在字段有效时返回null.

Also when applying validators we need to return null when the field is valid.

此外,由于您正在使用Angular材质,因此我们需要添加 ErrorStateMatcher 才能显示mat-errors. mat-errors仅在将验证器设置为表单控件而不是表单组时显示.

Also, since you are using Angular material, we need to add a ErrorStateMatcher to be able to show mat-errors. mat-errors show only when validators are set to form control, not a formgroup.

您的代码应如下所示:

createFormGroup() { this.myForm = this.fb.group({ mobile : new FormControl(''), homePhone : new FormControl('') // our custom validator }, { validator: this.atLeastOnePhoneRequired}); } atLeastOnePhoneRequired(group : FormGroup) : {[s:string ]: boolean} { if (group) { if(group.controls['mobile'].value || group.controls['homePhone'].value) { return null; } } return {'error': true}; }

错误状态匹配器:

export class MyErrorStateMatcher implements ErrorStateMatcher { isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { const controlTouched = !!(control && (control.dirty || control.touched)); const controlInvalid = !!(control && control.invalid); const parentInvalid = !!(control && control.parent && control.parent.invalid && (control.parent.dirty || control.parent.touched)); return (controlTouched && (controlInvalid || parentInvalid)); } }

在组件中用以下标记:

matcher = new MyErrorStateMatcher();

,然后在两个输入字段上将其标记到您的模板.还要注意*ngIf看起来如何显示验证消息:

and then mark it to your template on both input fields. Also note how the *ngIf looks for displaying validation messages:

<mat-form-field> <input matInput placeholder="Mobile" formControlName="mobile" [errorStateMatcher]="matcher"> <mat-error *ngIf="myForm.hasError('error')"> "Enter either phone number" </mat-error> </mat-form-field> <mat-form-field> <input matInput placeholder="Home Phone" formControlName="homePhone" [errorStateMatcher]="matcher"> <mat-error *ngIf="myForm.hasError('error')"> "Enter either phone number" </mat-error> </mat-form-field>

StackBlitz

StackBlitz

更多推荐

Angular 2自定义验证器,用于检查何时需要两个字段之一

本文发布于:2023-11-07 04:20:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1565560.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   字段   两个   Angular

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!