使用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 相关文章推荐
jQuery学习7 操作JavaScript对象和集合的函数
Feb 07 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
Mar 05 Javascript
js检测判断日期大于多少天的方法
May 04 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
Mar 05 Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 Javascript
Vue AST源码解析第一篇
Jul 19 Javascript
在Vue中如何使用Cookie操作实例
Jul 27 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
Oct 25 Javascript
关于vue-router的那些事儿
May 23 Javascript
微信小程序实现滴滴导航tab切换效果
Jul 24 Javascript
javascript关于“时间”的一次探索
Jul 24 Javascript
es6中Promise 对象基本功能与用法实例分析
Feb 23 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&amp;mysql(二)
2006/10/09 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
2013/03/20 Javascript
js控制input输入字符解析
2013/12/27 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
进一步探究Python的装饰器的运用
2015/05/05 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
深入理解Python3 内置函数大全
2017/11/23 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
python中的逆序遍历实例
2019/12/25 Python
Python如何实现FTP功能
2020/05/28 Python
Python selenium如何打包静态网页并下载
2020/08/12 Python
python定时截屏实现
2020/11/02 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
计算机专业毕业生自荐信
2013/12/31 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
2015年财政所工作总结
2015/04/25 职场文书
宿舍管理制度范本
2015/08/07 职场文书
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL
Python利用zhdate模块实现农历日期处理
2022/03/31 Python