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类定义例子
Sep 12 Javascript
基于jQuery的树控件实现代码(asp.net+json)
Jul 11 Javascript
jQuery UI Autocomplete 体验分享
Feb 14 Javascript
JavaScript程序员应该知道的45个实用技巧
Mar 04 Javascript
推荐10个2014年最佳的jQuery视频插件
Nov 12 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
Mar 27 Javascript
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
jquery自定义右键菜单、全选、不连续选择
Mar 01 Javascript
浅谈JS中逗号运算符的用法
Jun 12 Javascript
利用nvm管理多个版本的node.js与npm详解
Nov 02 Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
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中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
JavaScript中的私有成员
2006/09/18 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
JS前端笔试题分析
2016/12/19 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
幼儿如何来做好自我评价
2013/11/05 职场文书
火锅店的活动方案
2014/08/15 职场文书
小学班主任教育随笔
2015/08/15 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
PHP命令行与定时任务
2021/04/01 PHP
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android
Java详细解析==和equals的区别
2022/04/07 Java/Android
Elasticsearch 索引操作和增删改查
2022/04/19 Python