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中遭遇级联表达式陷阱
Mar 08 Javascript
调试Node.JS的辅助工具(NodeWatcher)
Jan 04 Javascript
js动态设置鼠标事件示例代码
Oct 30 Javascript
jQuery菜单插件superfish使用指南
Apr 21 Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 Javascript
浅谈JavaScript的全局变量与局部变量
Jun 10 Javascript
javascript简单写的判断电话号码实例
May 24 Javascript
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
Vue基于NUXT的SSR详解
Oct 24 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 Javascript
JS+CSS实现炫酷光感效果
Sep 05 Javascript
Angular短信模板校验代码
Sep 23 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
如何使用Strace调试工具
2013/06/03 PHP
php计算一个文件大小的方法
2015/03/30 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
node使用request请求的方法
2019/12/20 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
春节活动策划方案
2014/01/24 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
体育教师自我鉴定
2014/02/12 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
民生工程实施方案
2014/03/22 职场文书
销售内勤岗位职责
2014/04/15 职场文书
项目合作协议书
2014/04/16 职场文书
3的组成教学反思
2014/04/30 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
python turtle绘图
2022/05/04 Python