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』取指定url格式及分割函数应用
Apr 22 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
Sep 26 Javascript
jQuery表格插件datatables用法汇总
Mar 29 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
Jun 01 Javascript
深入理解Angularjs中的$resource服务
Dec 31 Javascript
原生js实现瀑布流布局
Mar 08 Javascript
jQuery使用bind函数实现绑定多个事件的方法
Oct 11 jQuery
详解JS数值Number类型
Feb 07 Javascript
angular1.x ui-route传参的三种写法小结
Aug 31 Javascript
Vue入门之数量加减运算操作示例
Dec 11 Javascript
jQuery Raty星级评分插件使用方法实例分析
Nov 25 jQuery
JS实现纵向轮播图(初级版)
Jan 18 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
德生PL550的电路分析
2021/03/02 无线电
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
一个加载js文件的小脚本
2007/06/28 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
html超链接打开窗口大小的方法
2013/03/05 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
python实现抖音点赞功能
2019/04/07 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
幼儿园小班植树节活动方案
2014/03/04 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
工地材料员岗位职责
2015/04/11 职场文书
企业党建工作总结2015
2015/05/26 职场文书
工作后的感想
2015/08/07 职场文书
毕业班工作总结
2015/08/10 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python