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 相关文章推荐
js实现的日期操作类DateTime函数代码
Mar 16 Javascript
autoIMG 基于jquery的图片自适应插件代码
Mar 12 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
Mar 26 Javascript
React.js入门实例教程之创建hello world 的5种方式
May 11 Javascript
使用bootstrap3开发响应式网站
May 12 Javascript
AngularJs表单验证实例详解
May 30 Javascript
Javascript动画效果(3)
Oct 11 Javascript
微信小程序页面开发注意事项整理
May 18 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
Sep 23 Javascript
vue父组件异步获取数据传给子组件的方法
Jul 26 Javascript
Vue实现图片轮播组件思路及实例解析
May 11 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 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
php中adodbzip类实例
2014/12/08 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
Python中装饰器的一个妙用
2015/02/08 Python
python 异常处理总结
2016/10/18 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
工作人员思想汇报
2014/01/09 职场文书
经典促销广告词大全
2014/03/19 职场文书
土建工程师岗位职责
2014/06/10 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
志愿者事迹材料
2014/12/26 职场文书
社区文明倡议书
2015/04/28 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
律师催款函范文
2015/06/24 职场文书