Angular2 自定义表单验证器的实现方法


Posted in Javascript onDecember 14, 2018

废话

最近由于项目上需要用到表单验证,前面直接通过 (input) 事件进行数据检查,但是不好和自带的验证器统一,而且也不正统。于是打算研究一下自定义验证器,网上类似的文章很多,但是自己在实现的过程中还是遇到了一些问题。于是还是??碌淖约盒匆黄?恼隆?/p>

正文

这里有官方文档:验证响应式表单,用户的视觉提示,自定义验证器,这篇文章是根据这些文档所来(前面两者就不再赘述比较简单,也说的比较清楚)

Angular支持的内置validate属性:

  • required- 设置表单控件值是非空的
  • email - 设置表单控件的格式是email
  • minlength - 设置表单控件值的最小长度
  • maxlength - 设置表单控件长度的最大值
  • pattern - 设置表单控件的值需匹配 pattern 对应的模式

通过表单控件的.valid判断验证结果,其结果状态:

  • valid - 有效
  • invalid - 无效
  • pristine - 表单值未改变
  • dirty - 表单值已改变
  • touched - 表单控件已被访问过
  • untouched- 表单控件未被访问过

我们经常会遇到如下场景,表单验证(样式比较丑陋请忽略)

Angular2 自定义表单验证器的实现方法

现在我们要实现 url 验证,可以直接通过 正则表达式来匹配,这样的话,直接用 Angular 自带的验证器即可,但是如果要兼容大写呢?我们就不能简单的直接使用正则来匹配了,我们需要在判断之前进行一次转换,把内容全部转换成小写,才能进行正则判断。

这里我们 新建一个 ValidatorBase 类来存放所有的验证,并且新建一个 静态方法 urlValidator(input:FormControl) 来对数据进行 url 验证。具体方法如下:

import { FormControl } from '@angular/forms';
import { Injectable } from '@angular/core'

export class ValidateBase{
 public static urlValidator(input: FormControl){
  let validateString = "(https?://|WWW|www|ftp://|file://)[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[.]+[-A-Za-z0-9+&@#/%=~_|]";

  console.log(input.value);
  //set value 
  let v = input.value;

    if(v!=undefined&&v!="")
    {
     if(v.toLowerCase().match(validateString))
     {
      return null;
     }
     else{
     return {
      isUrl:true
     }
    }
    }
    return null;
 }
}

注意:

这里当匹配成功(即验证成功是需要返回 null 的,不能返回 {isUrl:false},失败是返回的{isUrl:true},不是返回 {isUrl:false}),这样才会让最后表单验证的值为正确的表现。

这里{isUrl:true} 中的 isUrl,即为传入的 FormControl 的.hasError()中的参数值。

调用页面

<form [formGroup]="detailForm" (ngSubmit)="submit()">
 <div>
  <label for="LinkedURL">LinkedURL:</label>
  <input type="LinkedURL" name="LinkedURL" id="LinkedURL" [formControl]="LinkedURL">
  <div class="col-xs-4 col-sm-4" [style.color]="(LinkedURL.touched&&LinkedURL.valid==false)?'#d16e6c':'green'" [hidden]="LinkedURL.untouched">
   <div [hidden]="!LinkedURL.hasError('maxlength')">LinkedURL can not be greater than 250 characters.</div>
   <div [hidden]="!LinkedURL.hasError('isUrl')">LinkedURL is not an url.</div>
   <div [hidden]="!LinkedURL.hasError('required')">Required field.</div>
   <!--Success!-->
   <div [style.color]="'green'" [hidden]="!LinkedURL.valid">Validate success!</div>
  </div>
 </div>
 <button type="submit" [disabled]="!detailForm.valid">Log In</button>
</form>

调用页面对应 ts

import { ValidateBase } from './../../Validators/Validator.base';
import { Component, OnInit } from '@angular/core';

import {
 FormGroup,
 FormBuilder,
 FormControl,
 Validators
 } from '@angular/forms';

@Component({
 selector: 'validate-component',
 templateUrl: 'validate.component.html'
 })

export class SweepstakesDetailComponent implements OnInit {

 private detailForm: FormGroup;
 private LinkedURL: FormControl;

 ngOnInit(): void {
  this.validateForm();
 }

 private validateForm(){

  this.LinkedURL = new FormControl('',[
   Validators.required,
   Validators.maxLength(250),
   ValidateBase.urlValidator
  ]);

  //form
  this.detailForm = this.formBuilder.group({
   LinkedURL:this.LinkedURL,
  });
 }
}

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

Javascript 相关文章推荐
关于全局变量和局部变量的那些事
Jan 11 Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 Javascript
javascript时间差插件分享
Jul 18 Javascript
js canvas实现放大镜查看图片功能
Jun 08 Javascript
JavaScript 中调用 Kotlin 方法实例详解
Jun 09 Javascript
js中的事件委托或是事件代理使用详解
Jun 23 Javascript
mpvue性能优化实战技巧(小结)
Apr 17 Javascript
小程序登录之支付宝授权的实现示例
Dec 13 Javascript
node.js +mongdb实现登录功能
Jun 18 Javascript
vue实现移动端拖动排序
Aug 21 Javascript
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
浅析JavaScript中的变量提升
Jun 01 Javascript
JavaScript模板引擎应用场景及实现原理详解
Dec 14 #Javascript
详解React 服务端渲染方案完美的解决方案
Dec 14 #Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
Dec 14 #Javascript
JS实现的A*寻路算法详解
Dec 14 #Javascript
详解vue项目接入微信JSSDK的坑
Dec 14 #Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
Dec 14 #Javascript
javascript中的event loop事件循环详解
Dec 14 #Javascript
You might like
一个PHP模板,主要想体现一下思路
2006/12/25 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
详细讲解Python中的文件I/O操作
2015/05/24 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
Python如何计算语句执行时间
2019/11/22 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
详解Python中namedtuple的使用
2020/04/27 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
PHP面试题附答案
2015/11/28 面试题
C语言笔试题
2014/09/04 面试题
预防艾滋病宣传标语
2014/06/25 职场文书
影视广告专业求职信
2014/09/02 职场文书
成都人事代理协议书
2014/10/25 职场文书
2014年应急工作总结
2014/12/11 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript