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 有趣而诡异的数组
Apr 06 Javascript
jquery控制listbox中项的移动并排序的实现代码
Sep 28 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
Jun 09 Javascript
JQuery中节点遍历方法实例
May 18 Javascript
javascript中判断json的方法总结
Aug 27 Javascript
学习jQuey中的return false
Dec 18 Javascript
学习JavaScript事件流和事件处理程序
Jan 25 Javascript
AngularJS指令与指令之间的交互功能示例
Dec 14 Javascript
vue中element组件样式修改无效的解决方法
Feb 03 Javascript
代码分析vue中如何配置less
Sep 28 Javascript
JS实现获取自定义属性data值的方法示例
Dec 19 Javascript
微信小程序实现拨打电话功能的示例代码
Jun 28 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
风味层面去分析咖啡油脂
2021/03/03 咖啡文化
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
jQuery 源码分析笔记
2011/05/25 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
js中bool值的转换及“&amp;&amp;”、“||”、 “!!”详解
2017/12/21 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
Python温度转换实例分析
2018/01/17 Python
Django 拆分model和view的实现方法
2019/08/16 Python
python字符串的index和find的区别详解
2020/06/20 Python
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
自我评价如何写好?
2014/01/05 职场文书
行政主管职责范本
2014/03/07 职场文书
科技活动周标语
2014/10/08 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
市场部岗位职责范本
2015/04/15 职场文书
民事二审代理词
2015/05/25 职场文书
结婚典礼主持词
2015/06/29 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang