使用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中this关键词的使用技巧、工作原理以及注意事项
May 20 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
Aug 21 Javascript
编写高性能Javascript代码的N条建议
Oct 12 Javascript
jquery判断输入密码两次是否相等
Apr 22 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 Javascript
微信小程序 this和that详解及简单实例
Feb 13 Javascript
javascript 单例模式详解及简单实例
Feb 14 Javascript
vue 微信授权登录解决方案
Apr 10 Javascript
npm 更改默认全局路径以及国内镜像的方法
May 16 Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 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
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
Yii核心验证器api详解
2016/11/23 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
PHP7修改的函数
2021/03/09 PHP
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Python lambda和Python def区别分析
2014/11/30 Python
Python中的字典遍历备忘
2015/01/17 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Python argparse模块应用实例解析
2019/11/15 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
python opencv进行图像拼接
2020/03/27 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
简单的大学生自我鉴定
2014/02/18 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
综治工作心得体会
2014/09/11 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
python中对列表的删除和添加方法详解
2022/02/24 Python
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫