使用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之empty()与remove()区别说明
Sep 10 Javascript
jquery ajax jsonp跨域调用实例代码
Dec 11 Javascript
javascript 回到顶部效果的实现代码
Feb 17 Javascript
Jquery实现纵向横向菜单
Jan 24 Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 Javascript
教你如何在Node.js中使用jQuery
Aug 28 Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 Javascript
BootStrap实现文件上传并带有进度条效果
Sep 11 Javascript
Angular实现下拉框模糊查询功能示例
Jan 03 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
Dec 06 Javascript
JS实现容器模块左右拖动效果
Jan 14 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
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
人大复印资料处理程序_输入篇
2006/10/09 PHP
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
PHP使用递归生成文章树
2015/04/21 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
Vue中使用webpack别名的方法实例详解
2018/06/19 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
Python文本处理之按行处理大文件的方法
2018/04/09 Python
python批量爬取下载抖音视频
2019/06/17 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
前台文员职责范本
2014/03/07 职场文书
我的大学生活演讲稿
2014/04/25 职场文书
2014年护士长工作总结
2014/11/11 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
学生检讨书怎么写
2015/05/07 职场文书
《社戏》教学反思
2016/02/22 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
MySQL数据管理操作示例讲解
2022/12/24 MySQL