Angular2 自定义validators的实现方法


Posted in Javascript onJuly 05, 2017

angular 当需要form表单需要验证时,angular自带了许多校验器,但是很多时候自带的无法满足业务需求,这时候就需要自定义的校验器

定义一个validator

定义validator 需要实现 ValidatorFn 接口

源码:

export interface ValidatorFn {
  (c: AbstractControl): ValidationErrors | null;
}

接收一个 AbstractControl 返回 ValidationErrors 或者null

ValidationErrors 源码

export declare type ValidationErrors = {
  [key: string]: any;
};

这其实就是返回一个 key value 类型的对象,这个对象会在验证信息不通过的时候赋值给 formControl.errors

写好的Validator 需要在创建FormControl作为参数传入

FormControl 的构造器源码

export declare class FormControl extends AbstractControl {
  constructor(formState?: any, validator?: ValidatorFn | ValidatorFn[] | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null);

下面是个简单的例子(校验邮箱地址):

定义一个返回 ValidatorFn 接口的方法

static EMAIL_REG = new RegExp('\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}');
static email(): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } => { ①
   if (!EMAIL_REG.test(control.value)) { ②
    return { ③
     errMsg: '请输入正确的邮箱地址'
    };
   }
   return {}; ④
  };
 }

① 方法返回 ValidatorFn 的实例

② 判断是否符合邮箱正则表达式

③ 如果不符合 返回一个 ValidationErrors 对象,errMsg 作为错误信息输出 (这里也可以再加一个 布尔型的作为判断)

④ 如果校验成功返回一个空的对象

传入校验器

email = new FormControl('', email())

模板:

<p *ngIf = "!email.valid && email.touched">{{email.errors.errMsg}}</p>

当邮箱格式不正确时 这里就会显示 ‘请输入正确的邮箱地址'

至此一个简单的校验器就完成了。

如果想比较2个form的值是否相等的话只需要做一些小的改变

static EMAIL_REG = new RegExp('\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}');
static email(emailForm: FormControl): ValidatorFn { ①
  return (control: AbstractControl): { [key: string]: any } => { 
   if (emailForm.value !== control.value ) { 
    return { 
     errMsg: '请输入相同邮箱地址'
    };
   }
   return {}; 
  };
 }

① 只需要在这里传入另一个需要做对比的 formControl 即可

email = new FormControl('', email())
email2 = new FormControl('', email(email))

以上所述是小编给大家介绍的Angular2 自定义validators的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
js中方法重载如何实现?以及函数的参数问题
Aug 01 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
Jun 23 Javascript
跟我学习javascript的this关键字
May 28 Javascript
不同js异步函数同步的实现方法
May 28 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
Oct 14 Javascript
JavaScript日期选择功能示例
Jan 16 Javascript
js中开关变量使用实例
Feb 24 Javascript
详解Javascript几种跨域方式总结
Feb 27 Javascript
MUI实现上拉加载和下拉刷新效果
Jun 30 Javascript
详解vue-cli项目中怎么使用mock数据
May 29 Javascript
4 种滚动吸顶实现方式的比较
Apr 09 Javascript
js获取元素的偏移量offset简单方法(必看)
Jul 05 #Javascript
使用angular帮你实现拖拽的示例
Jul 05 #Javascript
使用JavaScript根据图片获取条形码的方法
Jul 04 #Javascript
jquery拖动改变div大小
Jul 04 #jQuery
JavaScript无操作后屏保功能的实现方法
Jul 04 #Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
Jul 04 #Javascript
5分钟打造简易高效的webpack常用配置
Jul 04 #Javascript
You might like
linux下 C语言对 php 扩展
2008/12/14 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
php扩展开发入门demo示例
2019/09/23 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
关于document.cookie的使用javascript
2010/10/29 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
jquery 遍历数组 each 方法详解
2016/05/25 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
python实现杨辉三角思路
2017/07/14 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
python梯度下降算法的实现
2020/02/24 Python
Python 去除字符串中指定字符串
2020/03/05 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
如何利用find命令查找文件
2016/11/18 面试题
软件测试有哪些?什么是配置项?
2012/02/12 面试题
求职信内容考虑哪几点
2013/10/05 职场文书
关于旷工的检讨书
2014/02/02 职场文书
实用的简历自我评价
2014/03/06 职场文书
2014年计生标语
2014/06/23 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
2014年班级工作总结
2014/11/14 职场文书
成绩单评语
2015/01/04 职场文书