Angular实现模版驱动表单的自定义校验功能(密码确认为例)


Posted in Javascript onMay 17, 2018

HTML5原生的表单校验属性(必填,长度限制,取值间隔,正则表达式等等)可以满足普通的校验需求,但是有些场景必须用到自定义校验,比如注册时的密码确认,有比对关系的时间/数值选择, 需要到请求到服务端取值验证等等···这里以密码确认为例进行说明。

指令开发

表单的验证状态是通过 formContro l的 errors 属性反馈出来的,所以基本的思路肯定就是需要添加校验规则,然后将验证结果添加到formControl实例的errors属性中。那么问题来了,模版驱动表单的控制都是在HTML模版中完成的,无法直接接触到 formControl实例。这个时候就需要使用指令了,将检验规则进行包装。Angular提供了 验证器供应商 NG_VALIDATORS ,用于处理表单自定义校验。先创建指令。

import { Directive} from '@angular/core';
import { NG_VALIDATORS, Validator, AbstractControl} from '@angular/forms';
@Directive({
 selector: '[appConfirmpsw]',
 providers: [{
  provide : NG_VALIDATORS,
  useExisting : ConfirmpswDirective,
  multi: true
 }]
})
export class ConfirmpswDirective implements Validator {
 constructor() {
  }
 validate(control: AbstractControl): {[key: string]: any} {
   //检验规则
 }
}

1、为指令指定供应商  NG_VALIDATORS , 和别名类 ConfirmpswDirective , 及 multi 为true(可以用同一个token,注册不同的 provide)。因为是在 NG_VALIDATORS 提供商中注册的指令,所以才能被Angular的验证流程识别,需要注意的是要用useExisting来注册,这样就不会创建一个新的实例。

2、用 Validator接口来约束 自定义的指令,这是Angular提供的验证器的类 。有validate属性,会传入表单的formControl,返回 ValidationErrors 对象。

现在指令结构完成,开始进行校验部分。首先需要传入已输入的密码,所以增加@input,再指定校验规则,判断绑定表单的值和传入的已输入值是否相同

@Input('appConfirmpsw') confirmpsw: string;

为了避免使用指令时,还需要额外传入confirmpsw属性 ( <input type="password" appConfirmpsw  [confirmpsw]="'xxx'" >),所以我们将 指令名称appConfirmpsw作为confirmpsw的别名,这样传值会比较方便,简化为  <input type="password" [appConfirmpsw] = "'xxx'">

这里专门写一个检验函数,用来比对值和返回结果。记得在指令的validate中调用一下

export function comfirmPswValidator(_confirmpsw: string): ValidatorFn { //传入已输入的密码值 , 返回一个ValidatorFn
 return (control: AbstractControl): {[key: string]: any} => { //传入绑定表单的formControl
  if ( !control.value ) { //如果绑定未输入值,则返回 required错误
   return { 'required' : true };
  }
//如果两次输入的值不相同,则返回confirmpsw的错误
  return control.value !== _confirmpsw ? {'confirmpsw' : {value: true}} : null;
 };
}

完整指令如下:

import { Directive, Input } from '@angular/core';
import { NG_VALIDATORS, Validator, AbstractControl, ValidatorFn} from '@angular/forms';

@Directive({
 selector: '[appConfirmpsw]',
 providers: [{
  provide : NG_VALIDATORS,
  useExisting : ConfirmpswDirective,
  multi: true
 }]
})
export class ConfirmpswDirective implements Validator {

 @Input('appConfirmpsw') confirmpsw: string;
 constructor() {

  }
 validate(control: AbstractControl): {[key: string]: any} {
  console.log(this.confirmpsw);
  return this.confirmpsw ? comfirmPswValidator(this.confirmpsw)(control) : null;
 }
}

export function comfirmPswValidator(_confirmpsw: string): ValidatorFn {
 return (control: AbstractControl): {[key: string]: any} => {
  if ( !control.value ) {
   return { 'required' : true };
  }
  return control.value !== _confirmpsw ? {'confirmpsw' : {value: true}} : null;
 };
}

 使用

测试一下指令的效果吧

<div class="input-group">
   <label class="group-label" for="psw-new"> 新密码 :</label>
   <input class="group-input" [(ngModel)]="inputpsw.new" #new="ngModel" type="password" name="psw" id="psw-new" required>
  </div>
  <div class="input-group input-error" *ngIf="new.touched&&new.invalid">
   <div class="group-error-content" *ngIf="new.errors?.required">确认密码为必填项!</div>
  </div>
  <div class="input-group">
   <label class="group-label" for="psw-confirm">确认密码 :</label>
   <input class="group-input" [(ngModel)]="inputpsw.confirm" #confirm="ngModel" type="password" name="confirm" id="psw-confirm"
   [appConfirmpsw] = "new.value" required>
  </div>
  <div class="input-group input-error" *ngIf="confirm.touched&&confirm.invalid">
   <div class="group-error-content" *ngIf="confirm.errors?.required">新密码为必填项!</div>
   <div class="group-error-content" *ngIf="confirm.errors?.confirmpsw">密码输入不一致!</div>
  </div>

传入new表单的值,并通过errors.confirmpsw属性来控制提示语反馈。密码输入不一致,可以正确的校验到

Angular实现模版驱动表单的自定义校验功能(密码确认为例)

确认密码为空时的提示也正确

Angular实现模版驱动表单的自定义校验功能(密码确认为例)

总结

以上所述是小编给大家介绍的Angular实现模版驱动表单的自定义校验功能(密码确认为例),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 空位补零实现代码
Feb 26 Javascript
一些经常会用到的Javascript检测函数
May 31 Javascript
在JQuery dialog里的服务器控件 事件失效问题
Dec 08 Javascript
用jQuery模拟页面加载进度条的实现代码
Dec 19 Javascript
js 实现的可折叠留言板(附源码下载)
Jul 01 Javascript
JavaScript计划任务后台运行的方法
Dec 18 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
Aug 06 Javascript
浅谈vue 单文件探索
Sep 05 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
Feb 13 Javascript
原生JS实现贪吃蛇小游戏
Mar 09 Javascript
vue使用swiper实现左右滑动切换图片
Oct 16 Javascript
详解Vue的列表渲染
Nov 20 Vue.js
AngularJS自定义过滤器用法经典实例总结
May 17 #Javascript
JS 实现分页打印功能
May 16 #Javascript
使用vue-cli导入Element UI组件的方法
May 16 #Javascript
JS 使用 window对象的print方法实现分页打印功能
May 16 #Javascript
Koa2微信公众号开发之消息管理
May 16 #Javascript
js实现鼠标单击Tab表单切换效果
May 16 #Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 #Javascript
You might like
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
PHP获取文件扩展名的4种方法
2015/11/24 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
php微信开发之谷歌测距
2018/06/14 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
python实现C4.5决策树算法
2018/08/29 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
商务英语应届生自我鉴定
2013/12/08 职场文书
北体毕业生求职信
2014/02/28 职场文书
保护环境的建议书
2014/03/12 职场文书
小学班主任评语大全
2014/04/23 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
论文答谢词
2015/01/20 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python