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 Tips(4) 一些关于提高JQuery性能的Tips
Dec 19 Javascript
js对象的构造和继承实现代码
Dec 05 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 20 Javascript
node.js实现BigPipe详解
Dec 05 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
javascript实现网站加入收藏功能
Dec 16 Javascript
基于JavaScript实现表格滚动分页
Nov 22 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
Aug 10 Javascript
javascript json字符串到json对象转义问题
Jan 22 Javascript
jQuery提示框插件SweetAlert用法分析
Aug 05 jQuery
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 Javascript
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 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获取远程图片并把它保存到本地的代码
2008/04/07 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
vue多次循环操作示例
2019/02/08 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
家长给孩子的评语
2014/01/30 职场文书
幼儿教师国培感言
2014/02/19 职场文书
2014年终个人工作总结
2014/11/07 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
加薪申请报告范本
2015/05/15 职场文书
创业计划书之家教托管
2019/09/25 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫