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实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
Jun 09 Javascript
jQuery中的val()示例应用
Feb 26 Javascript
Visual Studio中js调试的方法图解
Jun 30 Javascript
jQuery和AngularJS的区别浅析
Jan 29 Javascript
BOM系列第二篇之定时器requestAnimationFrame
Aug 17 Javascript
初识 Vue.js 中的 *.Vue文件
Nov 22 Javascript
基于javascript 显式转换与隐式转换(详解)
Dec 15 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
Oct 22 Javascript
JavaScript中常用的简洁高级技巧总结
Mar 10 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
Feb 01 jQuery
Vue实现点击导航栏当前标签后变色功能
Aug 19 Javascript
Vue看了就会的8个小技巧
Jan 21 Vue.js
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对象克隆clone用法示例
2016/09/28 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
python爬虫工具例举说明
2020/11/30 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
找到不普通的东西:Bonanza
2016/10/20 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
竞聘书模板
2014/03/31 职场文书
有关爱国演讲稿
2014/05/07 职场文书
合作意向书
2014/07/30 职场文书
师德师风事迹材料
2014/12/20 职场文书
土地租赁协议书
2015/01/29 职场文书
英文版辞职信
2015/02/28 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
法律意见书范文
2015/05/20 职场文书
公司2015年终工作总结
2015/05/26 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
python 进阶学习之python装饰器小结
2021/09/04 Python
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript