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 相关文章推荐
jQuery each()小议
Mar 18 Javascript
浅谈checkbox的一些操作(实战经验)
Nov 20 Javascript
JavaScript中的undefined学习总结
Nov 30 Javascript
javascript面向对象之this关键词用法分析
Jan 13 Javascript
js实现网页图片延时加载 提升网页打开速度
Jan 26 Javascript
canvas实现图像布局填充功能
Feb 06 Javascript
Javascript前端经典的面试题及答案
Mar 14 Javascript
vue 中filter的多种用法
Apr 26 Javascript
微信运维交互机器人的示例代码
Nov 12 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
May 22 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
Sep 21 jQuery
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
Oct 29 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生成随机密码的几种方法
2011/01/17 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
Js apply方法详解
2017/02/16 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[10:24]郎朗助力完美“圣”典,天籁交织奏响序曲
2016/12/18 DOTA
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
用Python遍历C盘dll文件的方法
2015/05/06 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
技校毕业生自荐信范文
2014/03/07 职场文书
小学作文评语大全
2014/04/21 职场文书
停电调休通知
2015/04/16 职场文书
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers