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 相关文章推荐
jQuery中的height innerHeight outerHeight区别示例介绍
Jun 15 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
Oct 20 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
Aug 02 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
Jan 13 Javascript
原生JS实现日历组件的示例代码
Sep 22 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 Javascript
JS块级作用域和私有变量实例分析
May 11 Javascript
深入学习Vue nextTick的用法及原理
Oct 08 Javascript
微信小程序定义和调用全局变量globalData的实现
Nov 01 Javascript
Vue+Element-UI实现上传图片并压缩
Nov 26 Javascript
从表单校验看JavaScript策略模式的使用详解
Oct 17 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
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
JQuery live函数
2010/12/24 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
完善的jquery处理机制
2016/02/21 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python使用post提交数据到远程url的方法
2015/04/29 Python
处理Python中的URLError异常的方法
2015/04/30 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
师范应届生语文教师求职信
2013/10/29 职场文书
高中班长自我鉴定
2013/12/20 职场文书
荷叶圆圆教学反思
2014/02/01 职场文书
运动会广播稿20字
2014/02/18 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
项目建议书
2015/02/04 职场文书
环保主题班会教案
2015/08/13 职场文书
心理健康教育主题班会
2015/08/13 职场文书