使用Angular自定义字段校验指令的方法示例


Posted in Javascript onFebruary 01, 2019

Angular中,提供的表单验证不能用于所有应用场景,就需要创建自定义验证器,比如对IP、MAC的合法性校验
这里是根据官网实例自定义MAC地址的正则校验,环境为Angular: 7.2.0 , NG-ZORRO:v7.0.0-rc3

添加指令

/shared/validator.directive.ts

注册到 NG_VALIDATORS 提供商中

providers: [
    {provide: NG_VALIDATORS, useExisting: ValidatorDirective, multi: true}
  ]

Angular 在验证流程中的识别出指令的作用,是因为指令把自己注册到了 NG_VALIDATORS 提供商中,该提供商拥有一组可扩展的验证器。

实现 Validator 接口

import {Directive, Input} from '@angular/core';
import {Validator, AbstractControl, NG_VALIDATORS} from '@angular/forms';

@Directive({
  selector: '[appValidator]',
    providers: [
      {provide: NG_VALIDATORS, useExisting: ValidatorDirective, multi: true}
    ]
})

export class ValidatorDirective implements Validator {
  @Input('appValidator') value: string;

  validate(control: AbstractControl): { [key: string]: any } | null {
    const validateMac = /^(([A-Fa-f0-9]{2}[:]){5}[A-Fa-f0-9]{2}[,]?)+$/;
    switch (this.value) {
      case 'mac':
        return validateMac.exec(control['value']) ? null : {validate: true};
        break;
    }
  }

}

ValidatorDirective写好后,只要把 appValidator 选择器添加到输入框上就可以激活这个验证器。

在模板中使用

首先在模板所在的module中引入该指令

import {ValidatorDirective} from "../../shared/validator.directive";

@NgModule({
  imports: [
    SharedModule
  ],
  declarations: [
    ValidatorDirective
  ],
  providers: [
    AuthGuard
  ],
})

在html中使用

<nz-form-item>
    <nz-form-control>
      <nz-input-group>
        <input formControlName="mac" nz-input type="text" placeholder="mac" appValidator="mac">
      </nz-input-group>
      <nz-form-explain *ngIf="validateForm.get('mac').dirty && validateForm.get('mac').errors">
        请输入正确的Mac地址!
      </nz-form-explain>
    </nz-form-control>
  </nz-form-item>

在mac地址校验不通过时,错误信息便会显示。如果想在失去焦点时显示错误信息可以使用validateForm.get('mac').touched,如下:

<nz-form-explain *ngIf="validateForm.get('mac').dirty && validateForm.get('mac').errors&&validateForm.get('mac').touched">
        请输入正确的Mac地址!
      </nz-form-explain>

到此,自定义字段验证指令就完成了,更多请查看Angular官网表单验证自定义验证器部分。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中URL编码函数代码
Jan 11 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
在JavaScript应用中实现延迟加载的方法
Jun 25 Javascript
Vue.js开发环境快速搭建教程
Mar 17 Javascript
jQuery层级选择器_动力节点节点Java学院整理
Jul 04 jQuery
剖析Angular Component的源码示例
Mar 23 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
May 23 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 jQuery
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
vue基于viewer实现的图片查看器功能
Apr 12 Javascript
JavaScript常用内置对象用法分析
Jul 09 Javascript
更优雅的微信小程序骨架屏实现详解
Aug 07 Javascript
angular中如何绑定iframe中src的方法
Feb 01 #Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 #Javascript
JS集合set类的实现与使用方法示例
Feb 01 #Javascript
详解如何使用webpack打包多页jquery项目
Feb 01 #jQuery
详解Vue中watch对象内属性的方法
Feb 01 #Javascript
JS字典Dictionary类定义与用法示例
Feb 01 #Javascript
在 Vue.js中优雅地使用全局事件的方法
Feb 01 #Javascript
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
php分页查询的简单实现代码
2017/03/14 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
python 批量将中文名转换为拼音
2021/02/07 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
PHP面试题集
2016/12/18 面试题
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
大三毕业自我鉴定
2014/01/15 职场文书
初一科学教学反思
2014/01/27 职场文书
员工晚婚的请假条
2014/02/08 职场文书
2015年服务员工作总结
2015/04/08 职场文书
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android