Angular實(shí)現(xiàn)表單驗(yàn)證功能
Angular表單驗(yàn)證分為兩種驗(yàn)證:1.內(nèi)置驗(yàn)證(required,minlength等);2.自定義驗(yàn)證(正則表達(dá)式)。
接下來我們用一個(gè)注冊賬號的demo來看一下這兩種驗(yàn)證是如何實(shí)現(xiàn)的。
項(xiàng)目界面
一、內(nèi)置驗(yàn)證
其中賬戶名有required驗(yàn)證和最短長度驗(yàn)證,其他兩個(gè)只有required驗(yàn)證
1.項(xiàng)目目錄
----------app.component.ts
----------app.component.html
----------app.component.css
----------app.module.ts
2.項(xiàng)目代碼
app.module.ts
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule,ReactiveFormsModule } from '@angular/forms';//表單驗(yàn)證必須導(dǎo)入這兩個(gè)模塊 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'); } }
簡單來說,在使用驗(yàn)證表單的時(shí)候,大致分為四步:
(1)導(dǎo)入相關(guān)模塊FormGroup, FormControl, Validators;
(2)聲明表單驗(yàn)證變量From:FromGroup;
(3)定義驗(yàn)證規(guī)則;
(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">確認(rèn)</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.項(xiàng)目效果
二、自定義驗(yàn)證
自定義表單驗(yàn)證,需要創(chuàng)建自定義驗(yàn)證器,我們接下來更改郵箱的驗(yàn)證,將其改為有格式的驗(yàn)證,而不是單純的存在驗(yàn)證,首先我們來看一下項(xiàng)目目錄的更改
1.項(xiàng)目目錄
----------app.component.ts
----------app.component.html
----------app.component.css
----------app.module.ts
----------emailAuthentication.ts
2.項(xiàng)目代碼
app.module.ts
注冊自定義驗(yàn)證器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'; //導(dǎo)入emailValidator自定義驗(yàn)證器 @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { title = 'app'; //email的正則表達(dá)式 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) //自定義驗(yàn)證器 ]), '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" >確認(rèn)</button> </div> </div>
在最后確認(rèn)的時(shí)候,我們設(shè)置一下按鈕的disabled屬性,在表單驗(yàn)證不通過的時(shí)候,確認(rèn)按鈕是點(diǎn)擊不了的,顯示不可點(diǎn)擊狀態(tài)。[disabled]="Form.invalid"。
3.項(xiàng)目效果
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺析Angular19 自定義表單控件
- Angular4編程之表單響應(yīng)功能示例
- AngularJS 表單驗(yàn)證手機(jī)號的實(shí)例(非必填)
- Angular搜索 過濾 批量刪除 添加 表單驗(yàn)證功能集錦(實(shí)例代碼)
- AngularJS實(shí)現(xiàn)的獲取焦點(diǎn)及失去焦點(diǎn)時(shí)的表單驗(yàn)證功能示例
- AngularJS表單驗(yàn)證功能
- AngularJS實(shí)現(xiàn)注冊表單驗(yàn)證功能
- angular4中關(guān)于表單的校驗(yàn)示例
- AngularJS實(shí)現(xiàn)表單驗(yàn)證功能詳解
- AngularJS實(shí)現(xiàn)表單元素值綁定操作示例
- Angular將填入表單的數(shù)據(jù)渲染到表格的方法
- Angular4表單驗(yàn)證代碼詳解
- angular動態(tài)表單制作
相關(guān)文章
angular2/ionic2 實(shí)現(xiàn)搜索結(jié)果中的搜索關(guān)鍵字高亮的示例
這篇文章主要介紹了angular2/ionic2 實(shí)現(xiàn)搜索結(jié)果中的搜索關(guān)鍵字高亮的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Angular中ng-bind和ng-model的區(qū)別實(shí)例詳解
這篇文章主要介紹了Angular中ng-bind和ng-model的區(qū)別實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04angularjs2 ng2 密碼隱藏顯示的實(shí)例代碼
本篇文章主要介紹了angularjs2 ng2 密碼隱藏顯示的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08AngularJS 實(shí)現(xiàn)彈性盒子布局的方法
本文給大家?guī)硪欢魏喍檀a實(shí)現(xiàn)angularjs彈性布局效果,非常實(shí)用,對angularjs彈出布局知識感興趣的朋友可以參考下2016-08-08詳解利用Angular實(shí)現(xiàn)多團(tuán)隊(duì)模塊化SPA開發(fā)框架
本篇文章主要介紹了詳解利用Angular實(shí)現(xiàn)多團(tuán)隊(duì)模塊化SPA開發(fā)框架,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Angular使用ng-messages與PHP進(jìn)行表單數(shù)據(jù)驗(yàn)證
這篇文章主要介紹了Angular使用ng-messages與PHP進(jìn)行表單數(shù)據(jù)驗(yàn)證,ng-messages提供了更方便的表單數(shù)據(jù)驗(yàn)證服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12