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 相关文章推荐
判断客户端浏览器是否安装了Flash插件的多种方法
Aug 11 Javascript
Dom在ajax技术中的作用说明
Oct 25 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
Apr 23 Javascript
js onmousewheel事件多次触发问题解决方法
Oct 17 Javascript
jquery拖拽效果完整实例(附demo源码下载)
Jan 14 Javascript
jQuery获取cookie值及删除cookie用法实例
Apr 15 Javascript
AngularJS 简单应用实例
Jul 28 Javascript
Node.js中的cluster模块深入解读
Jun 11 Javascript
Vuex 单状态库与多模块状态库详解
Dec 11 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
Jun 04 Javascript
js图片查看器插件用法示例
Jun 22 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 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 flv视频时间获取函数
2010/06/29 PHP
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
2021/02/18 Vue.js
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
使用python实现个性化词云的方法
2017/06/16 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
python绘制双柱形图代码实例
2017/12/14 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
python利用线程实现多任务
2020/09/18 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
Internet主要有哪些网络群组成
2015/12/24 面试题
斯福泰克软件测试面试题
2015/02/16 面试题
小学生考试获奖感言
2014/01/30 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书