Angular2 自定義表單驗(yàn)證器的實(shí)現(xiàn)方法
廢話
最近由于項(xiàng)目上需要用到表單驗(yàn)證,前面直接通過(guò) (input) 事件進(jìn)行數(shù)據(jù)檢查,但是不好和自帶的驗(yàn)證器統(tǒng)一,而且也不正統(tǒng)。于是打算研究一下自定義驗(yàn)證器,網(wǎng)上類(lèi)似的文章很多,但是自己在實(shí)現(xiàn)的過(guò)程中還是遇到了一些問(wèn)題。于是還是啰嗦的自己寫(xiě)一篇文章。
正文
這里有官方文檔:驗(yàn)證響應(yīng)式表單,用戶的視覺(jué)提示,自定義驗(yàn)證器,這篇文章是根據(jù)這些文檔所來(lái)(前面兩者就不再贅述比較簡(jiǎn)單,也說(shuō)的比較清楚)
Angular支持的內(nèi)置validate屬性:
- required- 設(shè)置表單控件值是非空的
- email - 設(shè)置表單控件的格式是email
- minlength - 設(shè)置表單控件值的最小長(zhǎng)度
- maxlength - 設(shè)置表單控件長(zhǎng)度的最大值
- pattern - 設(shè)置表單控件的值需匹配 pattern 對(duì)應(yīng)的模式
通過(guò)表單控件的.valid判斷驗(yàn)證結(jié)果,其結(jié)果狀態(tài):
- valid - 有效
- invalid - 無(wú)效
- pristine - 表單值未改變
- dirty - 表單值已改變
- touched - 表單控件已被訪問(wèn)過(guò)
- untouched- 表單控件未被訪問(wèn)過(guò)
我們經(jīng)常會(huì)遇到如下場(chǎng)景,表單驗(yàn)證(樣式比較丑陋請(qǐng)忽略)

現(xiàn)在我們要實(shí)現(xiàn) url 驗(yàn)證,可以直接通過(guò) 正則表達(dá)式來(lái)匹配,這樣的話,直接用 Angular 自帶的驗(yàn)證器即可,但是如果要兼容大寫(xiě)呢?我們就不能簡(jiǎn)單的直接使用正則來(lái)匹配了,我們需要在判斷之前進(jìn)行一次轉(zhuǎn)換,把內(nèi)容全部轉(zhuǎn)換成小寫(xiě),才能進(jìn)行正則判斷。
這里我們 新建一個(gè) ValidatorBase 類(lèi)來(lái)存放所有的驗(yàn)證,并且新建一個(gè) 靜態(tài)方法 urlValidator(input:FormControl) 來(lái)對(duì)數(shù)據(jù)進(jìn)行 url 驗(yàn)證。具體方法如下:
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;
}
}
注意:
這里當(dāng)匹配成功(即驗(yàn)證成功是需要返回 null 的,不能返回 {isUrl:false},失敗是返回的{isUrl:true},不是返回 {isUrl:false}),這樣才會(huì)讓最后表單驗(yàn)證的值為正確的表現(xiàn)。
這里{isUrl:true} 中的 isUrl,即為傳入的 FormControl 的.hasError()中的參數(shù)值。
調(diào)用頁(yè)面
<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>
調(diào)用頁(yè)面對(duì)應(yīng) 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,
});
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于AngularJS拖拽插件ngDraggable.js實(shí)現(xiàn)拖拽排序功能
ngDraggable.js是一款比較簡(jiǎn)單實(shí)用的angularJS拖拽插件,借助于封裝好的一些自定義指令,能夠快速的進(jìn)行一些拖拽應(yīng)用開(kāi)發(fā)。本文先從基本概念入手,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-04-04
Angular企業(yè)級(jí)開(kāi)發(fā)——MVC之控制器詳解
本篇文章主要介紹了Angular企業(yè)級(jí)開(kāi)發(fā)——MVC之控制器詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
AngularJS使用ng-app自動(dòng)加載bootstrap框架問(wèn)題分析
這篇文章主要介紹了AngularJS使用ng-app自動(dòng)加載bootstrap框架問(wèn)題,分析了前面文章中所述的ng-app自動(dòng)加載bootstrap出現(xiàn)的錯(cuò)誤原因與相應(yīng)的解決方法,需要的朋友可以參考下2017-01-01
Angular.js實(shí)現(xiàn)獲取驗(yàn)證碼倒計(jì)時(shí)60秒按鈕的簡(jiǎn)單方法
最近做項(xiàng)目的時(shí)候又遇到了驗(yàn)證碼倒計(jì)時(shí)的需求,發(fā)現(xiàn)這個(gè)功能還是挺實(shí)用的,所以就想著總結(jié)一下,下面這篇文章主要給大家介紹了關(guān)于利用Angular.js如何實(shí)現(xiàn)獲取驗(yàn)證碼倒計(jì)時(shí)按鈕的簡(jiǎn)單方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10
AngularJS基礎(chǔ) ng-open 指令簡(jiǎn)單實(shí)例
本文主要介紹AngularJS ng-open 指令,這里幫大家整理了ng-open指令的基本資料,有需要的小伙伴可以參考下2016-08-08
簡(jiǎn)述AngularJS相關(guān)的一些編程思想
這篇文章主要介紹了AngularJS相關(guān)的一些編程思想,AngularJS是一款熱門(mén)的JavaScript庫(kù),推薦!需要的朋友可以參考下2015-06-06
Angular 4環(huán)境準(zhǔn)備與Angular cli創(chuàng)建項(xiàng)目詳解
Angular4.0來(lái)了,更小,更快,改動(dòng)少,所以下面這篇文章主要給大家介紹了關(guān)于Angular 4環(huán)境準(zhǔn)備與學(xué)會(huì)使用Angular cli創(chuàng)建項(xiàng)目的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。2017-05-05
詳解angularjs跨頁(yè)面?zhèn)鲄⒂龅降囊恍﹩?wèn)題
這篇文章主要介紹了詳解angularjs跨頁(yè)面?zhèn)鲄⒂龅降囊恍﹩?wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11

