Ionic表单使用FormBuilder与Validators如何逐个显示错误消息
实现Ionic表单错误消息逐个显示的方案
当然可以实现一次只显示一条错误消息的需求!关键是给不同的错误设定优先级判断顺序,让页面只渲染当前最需要用户修正的那一条提示,而不是同时抛出所有满足条件的错误。
调整HTML模板的错误判断逻辑
你原来的写法会同时显示所有符合条件的错误,我们可以通过调整*ngIf的判断顺序,让前面的错误优先级更高,一旦匹配成功就不再渲染后续的错误提示:
<ion-item no-lines *ngIf="Form.get('password').touched && Form.get('password').invalid"> <div class="error" *ngIf="Form.get('password').hasError('required')"> 此字段不能为空 </div> <div class="error" *ngIf="!Form.get('password').hasError('required') && (Form.get('password').hasError('minlength') || Form.get('password').hasError('maxlength'))"> 请将密码长度保持在8到12个字符之间 </div> <div class="error" *ngIf="!Form.get('password').hasError('required') && !Form.get('password').hasError('minlength') && !Form.get('password').hasError('maxlength') && Form.get('password').hasError('pattern')"> 请输入字母数字组合 </div> </ion-item>
优化方案:把错误判断逻辑抽离到TS中
如果觉得HTML里的条件判断太冗长,可以在TS文件中写一个方法,根据优先级返回对应的错误消息,让模板更简洁:
修改后的TS代码
import { FormBuilder, Validators, FormGroup } from '@angular/forms'; // ... 其他组件代码 public Form: FormGroup; constructor(private formBuilder: FormBuilder) { this.Form = this.formBuilder.group({ password: ['', Validators.compose([ Validators.required, Validators.minLength(8), Validators.maxLength(12), Validators.pattern('^[a-zA-Z0-9]+$') // 修正正则:匹配字母数字组合 ])] }); } // 获取密码字段的优先级错误消息 getPasswordError(): string { const passwordControl = this.Form.get('password'); if (passwordControl.hasError('required')) { return '此字段不能为空'; } else if (passwordControl.hasError('minlength') || passwordControl.hasError('maxlength')) { return '请将密码长度保持在8到12个字符之间'; } else if (passwordControl.hasError('pattern')) { return '请输入字母数字组合'; } return ''; }
对应的HTML模板
<ion-item no-lines *ngIf="Form.get('password').touched && Form.get('password').invalid"> <div class="error">{{ getPasswordError() }}</div> </ion-item>
补充说明
- 错误的优先级顺序可以根据你的业务需求自由调整,比如如果希望长度错误比必填提示更优先,调换判断顺序即可。
- 注意你原代码中的
pattern正则[^A-Z]*是匹配无大写字母的内容,和你描述的“字母数字组合”需求不符,我已经在优化方案中修正为^[a-zA-Z0-9]+$,如果有其他规则可以自行调整。
内容的提问来源于stack exchange,提问作者Arane
相关产品推荐
相关产品推荐

