Angular实现表单验证功能


Posted in Javascript onNovember 13, 2017

Angular表单验证分为两种验证:1.内置验证(required,minlength等);2.自定义验证(正则表达式)。

接下来我们用一个注册账号的demo来看一下这两种验证是如何实现的。

项目界面

Angular实现表单验证功能

一、内置验证

其中账户名有required验证和最短长度验证,其他两个只有required验证

1.项目目录

----------app.component.ts

----------app.component.html

----------app.component.css

----------app.module.ts

2.项目代码

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule,ReactiveFormsModule }  from '@angular/forms';//表单验证必须导入这两个模块

import { AppComponent } from './app.component';

@NgModule({
 declarations: [
  AppComponent
 ],
 imports: [
  BrowserModule,
  FormsModule,  //注册模块
  ReactiveFormsModule
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }

app.component.ts

import { Component,OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';

@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent {
 title = 'app';
 Form:FormGroup;
 data={
   name:"",
   email:"",
   tel:""
 }
 ngOnInit(): void {
   this.Form = new FormGroup({
      'name': new FormControl(this.data.name, [
       Validators.required,
       Validators.minLength(4)
      ]),
      'email': new FormControl(this.data.email, Validators.required),
      'tel': new FormControl(this.data.tel, Validators.required)
     });
  }

  get name() { return this.Form.get('name'); }
  get email() { return this.Form.get('email'); }
  get tel() { return this.Form.get('tel'); }
}

简单来说,在使用验证表单的时候,大致分为四步:

(1)导入相关模块FormGroup, FormControl, Validators;

(2)声明表单验证变量From:FromGroup;

(3)定义验证规则;

(4)通过它所属的控件组(FormGroup)的get方法来访问表单控件

app.component.html

<div class="wrapper">
  <div class="row">
    <p class="title-wrapper">注册账号</p>
  </div>
  <div class="row">
    <div class="contain-wrapper" [formGroup]="Form">
      <label for="name">账户名:</label>
      <input type="text" id="name" formControlName="name"><br/>
      <div *ngIf="name.invalid && (name.dirty || name.touched)" class="alert alert-danger">
        <div *ngIf="name.errors.required">
          请输入长度账户名!
        </div>
        <div *ngIf="name.errors.minlength">
          账户名长度不小于4!
        </div>
      </div>
      <label for="email">邮箱:</label>
      <input type="text" id="email" formControlName="email"><br/>
      <div *ngIf="email.invalid && (email.dirty || email.touched)" class="alert alert-danger">
        <div *ngIf="email.errors.required">
          请输入邮箱!
        </div>
      </div>
      <label for="tel">电话:</label>
      <input type="text" id="tel" formControlName="tel">
      <div *ngIf="tel.invalid && (tel.dirty || tel.touched)" class="alert alert-danger">
        <div *ngIf="tel.errors.required">
          请输入电话!
        </div>
      </div>
    </div>
  </div>
  <div class="row">
    <button class="btn btn-primary confirm">确认</button>
  </div>
</div>

app.component.css

*{
  font-size: 18px;
}
.wrapper{
  margin: 0 auto;
  margin-top:10%;
  width:30%;
  height: 20%;
  border:1px solid black;
  border-radius: 10px;
}

.title-wrapper{
  margin: 0 auto;
  padding-top: 20px; 
  padding-bottom: 20px;
  width:370px;
  text-align: center;
  font-size: 20px;
  font-weight: 800;
}
label{
  display: inline-block;
  width:72px;
}
.contain-wrapper{
  width: 300px;
  margin:0 auto;
}
.confirm{
  margin-top:20px;
  width:100%;

}

3.项目效果

Angular实现表单验证功能

二、自定义验证

自定义表单验证,需要创建自定义验证器,我们接下来更改邮箱的验证,将其改为有格式的验证,而不是单纯的存在验证,首先我们来看一下项目目录的更改

1.项目目录

----------app.component.ts

----------app.component.html

----------app.component.css

----------app.module.ts

----------emailAuthentication.ts

2.项目代码

app.module.ts

注册自定义验证器EmailValidatorDirective

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule,ReactiveFormsModule }  from '@angular/forms';
import { EmailValidatorDirective } from './emailAuthentication';

import { AppComponent } from './app.component';

@NgModule({
 declarations: [
  AppComponent,
  EmailValidatorDirective
 ],
 imports: [
  BrowserModule,
  FormsModule,
  ReactiveFormsModule
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }

emailAuthentication.ts

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

/** A hero's name can't match the given regular expression */
export function emailValidator(nameRe: RegExp): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } => {
    const forbidden = !nameRe.test(control.value);
    return forbidden ? { 'forbiddenName': { value: control.value } } : null;
  };
}

@Directive({
  selector: '[appForbiddenName]',
  providers: [{ provide: NG_VALIDATORS, useExisting: EmailValidatorDirective, multi: true }]
})
export class EmailValidatorDirective implements Validator {
  @Input() forbiddenName: string;

  validate(control: AbstractControl): { [key: string]: any } {
    return this.forbiddenName ? emailValidator(new RegExp(this.forbiddenName, 'i'))(control)
      : null;
  }
}

app.component.ts

import { Component,OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { emailValidator } from './emailAuthentication'; //导入emailValidator自定义验证器

@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent {
 title = 'app';
 //email的正则表达式
 emailExp = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/ ;
 Form:FormGroup;
 data={
   name:"",
   email:"",
   tel:""
 }
 ngOnInit(): void {
   this.Form = new FormGroup({
      'name': new FormControl(this.data.name, [
       Validators.required,
       Validators.minLength(4)
      ]),
      'email': new FormControl(this.data.email, [
        Validators.required,
        emailValidator(this.emailExp) //自定义验证器
        ]),
      'tel': new FormControl(this.data.tel, Validators.required)
     });
  }

  get name() { return this.Form.get('name'); }
  get email() { return this.Form.get('email'); }
  get tel() { return this.Form.get('tel'); }
}

app.component.html

<div class="wrapper">
  <div class="row">
    <p class="title-wrapper">注册账号</p>
  </div>
  <div class="row">
    <div class="contain-wrapper" [formGroup]="Form">
      <label for="name">账户名:</label>
      <input type="text" id="name" formControlName="name"><br/>
      <div *ngIf="name.invalid && (name.dirty || name.touched)" class="alert alert-danger">
        <div *ngIf="name.errors.required">
          请输入账户名!
        </div>
        <div *ngIf="name.errors.minlength">
          账户名长度不小于4!
        </div>
      </div>
      <label for="email">邮箱:</label>
      <input type="text" id="email" formControlName="email" required><br/>
      <div *ngIf="email.invalid && (email.dirty || email.touched)" class="alert alert-danger">
        <div *ngIf="email.errors.forbiddenName">
         请输入正确格式的邮箱!
        </div>
      </div>
      <label for="tel">电话:</label>
      <input type="text" id="tel" formControlName="tel">
      <div *ngIf="tel.invalid && (tel.dirty || tel.touched)" class="alert alert-danger">
        <div *ngIf="tel.errors.required">
          请输入电话!
        </div>
      </div>
    </div>
  </div>
  <div class="row">
    <button class="btn btn-primary confirm" [disabled]="Form.invalid" >确认</button>
  </div>
</div>

在最后确认的时候,我们设置一下按钮的disabled属性,在表单验证不通过的时候,确认按钮是点击不了的,显示不可点击状态。[disabled]="Form.invalid"。

3.项目效果

Angular实现表单验证功能

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

Javascript 相关文章推荐
setTimeout 不断吐食CPU的问题分析
Apr 01 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
Jan 09 Javascript
移动节点的jquery代码
Jan 13 Javascript
JS控制一个DIV层在指定时间内消失的方法
Feb 17 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
Oct 20 Javascript
javascript手工制作悬浮菜单
Feb 12 Javascript
提高jQuery性能优化的技巧
Aug 03 Javascript
jQuery EasyUI 获取tabs的实例解析
Dec 06 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
Dec 30 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
Aug 04 Javascript
vue 组件基础知识总结
Jan 26 Vue.js
mescroll.js上拉加载下拉刷新组件使用详解
Nov 13 #Javascript
Vue.js用法详解
Nov 13 #Javascript
利用HBuilder打包前端开发webapp为apk的方法
Nov 13 #Javascript
JS实现提交表单前的数字及邮箱校检功能
Nov 13 #Javascript
vue 挂载路由到头部导航的方法
Nov 13 #Javascript
详解Vuex管理登录状态
Nov 13 #Javascript
Vue2 配置 Axios api 接口调用文件的方法
Nov 13 #Javascript
You might like
PHP5常用函数列表(分享)
2013/06/07 PHP
php验证码实现代码(3种)
2015/09/07 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
客户端静态页面玩分页
2006/06/26 Javascript
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
关于jquery css的使用介绍
2013/04/18 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
jQuery中:first选择器用法实例
2014/12/30 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
ng-zorro-antd 入门初体验
2018/12/03 Javascript
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
python如何判断IP地址合法性
2020/04/05 Python
Ratchet 模态框的实现
2020/08/19 HTML / CSS
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
社区八一活动方案
2014/02/03 职场文书
大课间活动实施方案
2014/03/06 职场文书
文案策划求职信
2014/04/14 职场文书
会计演讲稿范文
2014/05/23 职场文书
Python机器学习之决策树和随机森林
2021/07/15 Javascript