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中面向对象技术的模拟
Sep 25 Javascript
Firefox getBoxObjectFor getBoundingClientRect联系
Oct 26 Javascript
js form action动态修改方法
Nov 04 Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
Aug 23 Javascript
javascript列表框操作函数集合汇总
Nov 28 Javascript
js 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
laydate.js日期时间选择插件
Jan 04 Javascript
JavaScript数据结构之二叉树的查找算法示例
Apr 13 Javascript
ES6中参数的默认值语法介绍
May 03 Javascript
JS实现炫酷雪花飘落效果
Aug 19 Javascript
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
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
YII实现分页的方法
2014/07/09 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
PHP与以太坊交互详解
2018/08/24 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
ES2020 新特性(种草)
2020/01/12 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
Python分治法定义与应用实例详解
2017/07/28 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
Weblogic的布署方式
2013/08/23 面试题
建筑安全责任书范本
2014/07/24 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
导游词之西递宏村
2019/12/10 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL