angular 实现同步验证器跨字段验证的方法


Posted in Javascript onApril 11, 2019

几乎每个web应用都会用到表单,Angular 为我们提供了几个内置 validators (验证器),但在实际工作中为了满足项目需求,我们经常需要为应用添加一些自定义验证功能。

angular内置验证器

  • required - 表单控件值非空
  • email - 表单控件值的格式是 email
  • minlength - 表单控件值的最小长度
  • maxlength - 表单控件值的最大长度
  • pattern - 表单控件的值需匹配 pattern 对应的模式(正则表达式)

需求:设置成绩占比时,如果总占比不是100%,则无法通过验证。

angular 实现同步验证器跨字段验证的方法

分析:需求很简单,只需要写一个验证器即可,由于不需要访问后台,且验证器与三个字段有关,所以是同步跨字段验证。

实现验证器

首先,去官网上找示例代码:

export const identityRevealedValidator: ValidatorFn = (control: FormGroup): ValidationErrors | null => {
 const name = control.get('name');
 const alterEgo = control.get('alterEgo');

 return name && alterEgo && name.value === alterEgo.value ? { 'identityRevealed': true } : null;
};

解释:这个身份验证器实现了 ValidatorFn 接口。它接收一个 Angular 表单控件对象作为参数,当表单有效时,它返回一个 null,否则返回 ValidationErrors 对象。

从上可知,所谓跨字段,就是从验证表单单个控件formControl变成了验证整个表单formGroup了,而formGroup的每个字段就是formControl。

angular 实现同步验证器跨字段验证的方法

明白了这个原理,就是根据需求进行改写:

// 判断总占比是否等于100
  export const scoreWeightSumValidator: ValidatorFn = (formGroup: FormGroup): ValidationErrors | null => {
  const sumLegal = formGroup.get('finalScoreWeight')
    .value + formGroup.get('middleScoreWeight')
    .value + formGroup.get('usualScoreWeight')
    .value === 100;
    // 如果是,返回一个 null,否则返回 ValidationErrors 对象。
  return sumLegal ? null : {'scoreWeightSum': true};
};

到此,验证器已经写完。

添加到响应式表单

给要验证的 FormGroup 添加验证器,就要在创建时把一个新的验证器传给它的第二个参数。

ngOnInit(): void {
  this.scoreSettingAddFrom = this.fb.group({
    finalScoreWeight: [null, [Validators.required, scoreWeightValidator]],
    fullScore: [null, [Validators.required]],
    middleScoreWeight: [null, [Validators.required, scoreWeightValidator]],
    name: [null, [Validators.required]],
    passScore: [null, [Validators.required]],
    priority: [null, [Validators.required]],
    usualScoreWeight: [null, [Validators.required, scoreWeightValidator]],
  }, {validators: scoreWeightSumValidator});
}

添加错误提示信息

我使用的是ng-zorro框架,当三个成绩占比均输入时,触发验证

<nz-form-item nz-row>
  <nz-form-control nzValidateStatus="error" nzSpan="12" nzOffset="6">
    <nz-form-explain
      *ngIf="scoreSettingAddFrom.errors?.scoreWeightSum &&
       scoreSettingAddFrom.get('middleScoreWeight').dirty &&
       scoreSettingAddFrom.get('finalScoreWeight').dirty &&
       scoreSettingAddFrom.get('usualScoreWeight').dirty">成绩总占比需等于100%!
    </nz-form-explain>
  </nz-form-control>
</nz-form-item>

效果:

angular 实现同步验证器跨字段验证的方法

总结

总的来说这个验证器实现起来不算很难,就是读懂官方文档,然后根据自己的需求进行改写。

参考文档:angular表单验证 跨字段验证

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中的作用域scope介绍
Dec 28 Javascript
js复制网页内容并兼容各主流浏览器的代码
Dec 17 Javascript
jQuery中height()方法用法实例
Dec 24 Javascript
javascript实现判断鼠标的状态
Jul 10 Javascript
js获取图片宽高的方法
Nov 25 Javascript
AngularJS Module方法详解
Dec 08 Javascript
Jquery组件easyUi实现表单验证示例
Aug 23 Javascript
解决Angular.Js与Django标签冲突的方案
Dec 20 Javascript
js canvas实现红包照片效果
Aug 21 Javascript
vue制作toast组件npm包示例代码
Oct 29 Javascript
js实现电灯开关效果
Jan 19 Javascript
教你使用vscode 搭建react-native开发环境
Jul 07 Javascript
vue实现新闻展示页的步骤详解
Apr 11 #Javascript
记一次用vue做的活动页的方法步骤
Apr 11 #Javascript
vue数据初始化initState的实例详解
Apr 11 #Javascript
Vue起步(无cli)的啊教程详解
Apr 11 #Javascript
vue+vuex+json-seiver实现数据展示+分页功能
Apr 11 #Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
Apr 10 #Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 #Javascript
You might like
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
python实现rest请求api示例
2014/04/22 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
Python numpy数组转置与轴变换
2019/11/15 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
会计专业毕业生自我鉴定
2013/10/29 职场文书
信息管理专业推荐信
2013/10/29 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
中文教师求职信
2014/02/22 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
银行求职信范文
2019/05/13 职场文书
sql查询结果列拼接成逗号分隔的字符串方法
2021/05/25 SQL Server
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript