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 相关文章推荐
Document 对象的常用方法
Jul 31 Javascript
基于jquery可配置循环左右滚动例子
Sep 09 Javascript
javascript针对DOM的应用实例(一)
Apr 15 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
Jul 10 Javascript
js简单实现竖向tab选项卡的方法
May 04 Javascript
函数window.open实现关闭所有的子窗口
Aug 03 Javascript
asp知识整理笔记3(问答模式)
Sep 27 Javascript
js弹出对话框方式小结
Nov 17 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 Javascript
解决vue 退出动画无效的问题
Aug 09 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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
php实现购物车功能(上)
2020/07/23 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
jQuery 使用个人心得
2009/02/26 Javascript
Javascript select下拉框操作常用方法
2009/11/09 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
Vue.use源码学习小结
2018/06/20 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
js实现简单音乐播放器
2020/06/30 Javascript
Python 常用string函数详解
2016/05/30 Python
Python注释详解
2016/06/01 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
python实现图片中文字分割效果
2019/07/22 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
Python求解正态分布置信区间教程
2019/11/20 Python
学校岗位设置方案
2014/01/16 职场文书
教学实验楼管理制度
2014/02/01 职场文书
20年同学聚会感言
2014/02/03 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
公安机关起诉意见书
2015/05/20 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python