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 相关文章推荐
jQuery的运行机制和设计理念分析
Apr 05 Javascript
jquery中防刷IP流量软件影响统计的一点对策
Jul 10 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
js中substring和substr两者区别和使用方法
Nov 09 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
AngularJS的ng-click传参的方法
Jun 19 Javascript
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
JS实现读取xml内容并输出到div中的方法示例
Apr 19 Javascript
JavaScript键盘事件常见用法实例分析
Jan 03 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
Oct 26 Javascript
针对Vue路由history模式下Nginx后台配置操作
Oct 22 Javascript
Vue + ts实现轮播插件的示例
Nov 10 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
PHP strtok()函数的优点分析
2010/03/02 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
Python 文件操作实现代码
2009/10/07 Python
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
详解python中init方法和随机数方法
2019/03/13 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
Python 代码调试技巧示例代码
2020/08/11 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
html5 input属性使用示例
2013/06/28 HTML / CSS
个人担保书格式范文
2014/05/12 职场文书
工程售后服务方案
2014/06/08 职场文书
微观世界观后感
2015/06/10 职场文书
筑梦中国心得体会
2016/01/18 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
怎么用Python识别手势数字
2021/06/07 Python
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL
mysql数据库如何转移到oracle
2022/12/24 MySQL