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中window.event事件用法详解
Dec 11 Javascript
深入理解JavaScript高级之词法作用域和作用域链
Dec 10 Javascript
jQuery级联操作绑定事件实例
Sep 02 Javascript
JavaScript使用slice函数获取数组部分元素的方法
Apr 06 Javascript
再谈JavaScript线程
Jul 10 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
Oct 10 Javascript
jqueryUI tab标签页代码分享
Oct 09 jQuery
vue.js select下拉框绑定和取值方法
Mar 03 Javascript
jQuery超简单遮罩层实现方法示例
Sep 06 jQuery
JavaScript ES6箭头函数使用指南
Dec 30 Javascript
javascript实现的时间格式加8小时功能示例
Jun 13 Javascript
Openlayers实现扩散的动态点(水纹效果)
Aug 17 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
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
页面使用密码保护代码
2013/04/10 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
js实现日历的简单算法
2017/01/24 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
Python yield与实现方法代码分析
2018/02/06 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
Django 视图层(view)的使用
2018/11/09 Python
python输入多行字符串的方法总结
2019/07/02 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
解决Django no such table: django_session的问题
2020/04/07 Python
python 异步async库的使用说明
2020/05/04 Python
Python 没有main函数的原因
2020/07/10 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
政风行风评议个人心得体会
2014/10/29 职场文书
综治目标管理责任书
2015/05/11 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android