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 相关文章推荐
Mootools 1.2教程 选项卡效果(Tabs)
Sep 15 Javascript
JavaScript之自定义类型
May 04 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 Javascript
JQuery表单验证插件EasyValidator用法分析
Nov 15 Javascript
js实现透明度渐变效果的方法
Apr 10 Javascript
JS正则替换去空格的方法
Mar 24 Javascript
JS实现按钮添加背景音乐示例代码
Oct 17 Javascript
mui上拉加载更多下拉刷新数据的封装过程
Nov 03 Javascript
vue 组件的封装之基于axios的ajax请求方法
Aug 11 Javascript
vue路由前进后退动画效果的实现代码
Dec 10 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
小程序如何获取多个formId实现详解
Sep 20 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自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
cakephp常见知识点汇总
2017/02/24 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
python基础教程之元组操作使用详解
2014/03/25 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
生物科学专业个人求职信范文
2013/12/07 职场文书
工作自荐信
2013/12/11 职场文书
房屋改造计划书
2014/01/10 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
物业工程部岗位职责
2015/02/11 职场文书
第二次离婚起诉书
2015/05/18 职场文书
了解Redis常见应用场景
2021/06/23 Redis
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python