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 相关文章推荐
在线编辑器的实现原理(兼容IE和FireFox)
Mar 09 Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
Feb 13 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
Jun 20 Javascript
JS原型链怎么理解
Jun 27 Javascript
Angularjs实现搜索关键字高亮显示效果
Jan 17 Javascript
JS简单获取当前年月日星期的方法示例
Feb 07 Javascript
微信小程序中实现一对多发消息详解及实例代码
Feb 14 Javascript
layui表格数据重载
Jul 27 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
Aug 15 Javascript
Vue-cli 移动端布局和动画使用详解
Aug 10 Javascript
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
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
PHP实时显示输出
2008/10/02 PHP
一步一步学习PHP(8) php 数组
2010/03/05 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
jquery.validate使用攻略 第三部
2010/07/01 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
Jquery异步提交表单代码分享
2015/03/26 Javascript
jQuery.each使用详解
2015/07/07 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
2017/06/17 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
React中的render何时执行过程
2018/04/13 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
Python学习笔记之解析json的方法分析
2017/04/21 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
python语音识别实践之百度语音API
2018/08/30 Python
Python发展简史 Python来历
2019/05/14 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
经济管理专业自荐信
2013/12/30 职场文书
消防安全汇报材料
2014/02/08 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
烟台的海导游词
2015/02/02 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP