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 相关文章推荐
window.js 主要包含了页面的一些操作
Dec 23 Javascript
HTML颜色选择器实现代码
Nov 23 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
May 26 Javascript
javascript框架设计之类工厂
Jun 23 Javascript
JavaScript中解析JSON数据的三种方法
Jul 03 Javascript
Javascript函数式编程简单介绍
Oct 11 Javascript
jQuery的事件预绑定
Dec 05 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
Jan 10 Javascript
原生javascript移动端滑动banner效果
Mar 10 Javascript
基于Bootstrap实现城市三级联动
Nov 23 Javascript
vue代码分割的实现(codesplit)
Nov 13 Javascript
Vue最新防抖方案(必看篇)
Oct 30 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的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
PHP xpath()函数讲解
2019/02/11 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
javascript中clone对象详解
2014/12/03 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
javascript中的面向对象
2017/03/30 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
使用python读取.text文件特定行的数据方法
2019/01/28 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
python使用建议技巧分享(三)
2020/08/18 Python
实习自我评价怎么写
2013/12/02 职场文书
银行服务感言
2014/03/01 职场文书
卫生系统先进事迹
2014/05/13 职场文书
授权委托书范文
2014/07/31 职场文书
2014年英语工作总结
2014/12/20 职场文书
搞笑结婚保证书
2015/05/08 职场文书