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 相关文章推荐
JAVASCRIPT下判断IE与FF的比较简单的方式
Oct 17 Javascript
Javascript 入门基础学习
Mar 10 Javascript
javascript 事件处理程序介绍
Jun 27 Javascript
深入探寻javascript定时器
Jan 02 Javascript
js控制页面的全屏展示和退出全屏显示的方法
Mar 10 Javascript
Jquery中map函数的用法
Jun 03 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
Jun 23 Javascript
纯js的右下角弹窗实例
Mar 12 Javascript
React-Native左右联动List的示例代码
Sep 21 Javascript
微信小程序实现图片放大预览功能
Oct 22 Javascript
vue cli3 配置proxy代理无效的解决
Oct 30 Javascript
使用react-virtualized实现图片动态高度长列表的问题
May 28 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
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
javascript 数组的方法集合
2008/06/05 Javascript
jquery创建div 实现代码
2009/04/27 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
javascript模块化简单解析
2016/04/07 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
js实现滑动进度条效果
2020/08/21 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
python中数字是否为可变类型
2020/07/08 Python
高考考python编程是真的吗
2020/07/20 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
浙大网新C/C++面试解惑
2015/05/27 面试题
应届大学生简历中的自我评价
2014/01/15 职场文书
房屋出售协议书
2014/04/10 职场文书
《最佳路径》教学反思
2014/04/13 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
开工典礼致辞
2015/07/29 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers