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.validate使用攻略 第二部
Jul 01 Javascript
jQuery获取对象简单实现方法小结
Oct 30 Javascript
JavaScript 实现打印,打印预览,打印设置
Dec 30 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
利用bootstrapValidator验证UEditor
Sep 14 Javascript
Bootstrap CSS组件之输入框组
Dec 17 Javascript
JS常用倒计时代码实例总结
Feb 07 Javascript
Vue中使用vue-i18插件实现多语言切换功能
Apr 25 Javascript
vue仿ios列表左划删除
Sep 26 Javascript
JavaScript实时更新当前的时间的示例代码
Jul 15 Javascript
jQuery实现计算器功能
Oct 19 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
重料打造自己的“宝马”---第三代
2021/03/02 无线电
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
php中apc缓存使用示例
2013/12/25 PHP
yii中widget的用法
2014/12/03 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
快速入门Vue
2016/12/19 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
什么是lambda函数
2013/09/17 面试题
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
工程质量承诺书范文
2014/03/27 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
护士节慰问信
2015/02/15 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript