Angular2 自定義表單驗證器的實現(xiàn)方法
廢話
最近由于項目上需要用到表單驗證,前面直接通過 (input) 事件進(jìn)行數(shù)據(jù)檢查,但是不好和自帶的驗證器統(tǒng)一,而且也不正統(tǒng)。于是打算研究一下自定義驗證器,網(wǎng)上類似的文章很多,但是自己在實現(xiàn)的過程中還是遇到了一些問題。于是還是啰嗦的自己寫一篇文章。
正文
這里有官方文檔:驗證響應(yīng)式表單,用戶的視覺提示,自定義驗證器,這篇文章是根據(jù)這些文檔所來(前面兩者就不再贅述比較簡單,也說的比較清楚)
Angular支持的內(nèi)置validate屬性:
- required- 設(shè)置表單控件值是非空的
- email - 設(shè)置表單控件的格式是email
- minlength - 設(shè)置表單控件值的最小長度
- maxlength - 設(shè)置表單控件長度的最大值
- pattern - 設(shè)置表單控件的值需匹配 pattern 對應(yīng)的模式
通過表單控件的.valid判斷驗證結(jié)果,其結(jié)果狀態(tài):
- valid - 有效
- invalid - 無效
- pristine - 表單值未改變
- dirty - 表單值已改變
- touched - 表單控件已被訪問過
- untouched- 表單控件未被訪問過
我們經(jīng)常會遇到如下場景,表單驗證(樣式比較丑陋請忽略)
現(xiàn)在我們要實現(xiàn) url 驗證,可以直接通過 正則表達(dá)式來匹配,這樣的話,直接用 Angular 自帶的驗證器即可,但是如果要兼容大寫呢?我們就不能簡單的直接使用正則來匹配了,我們需要在判斷之前進(jìn)行一次轉(zhuǎn)換,把內(nèi)容全部轉(zhuǎn)換成小寫,才能進(jìn)行正則判斷。
這里我們 新建一個 ValidatorBase 類來存放所有的驗證,并且新建一個 靜態(tài)方法 urlValidator(input:FormControl) 來對數(shù)據(jù)進(jìn)行 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; } }
注意:
這里當(dāng)匹配成功(即驗證成功是需要返回 null 的,不能返回 {isUrl:false},失敗是返回的{isUrl:true},不是返回 {isUrl:false}),這樣才會讓最后表單驗證的值為正確的表現(xiàn)。
這里{isUrl:true} 中的 isUrl,即為傳入的 FormControl 的.hasError()中的參數(shù)值。
調(diào)用頁面
<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ī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, }); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
AngularJS實現(xiàn)數(shù)據(jù)列表的增加、刪除和上移下移等功能實例
這篇文章給大家分享了AngularJS循環(huán)實現(xiàn)數(shù)據(jù)列表的增加、刪除和上移下移等基礎(chǔ)功能,對大家學(xué)習(xí)AngularJS具有一定的參考借鑒價值,有需要的朋友可以看看。2016-09-09Angular5中調(diào)用第三方j(luò)s插件的方法
下面小編就為大家分享一篇Angular5中調(diào)用第三方j(luò)s插件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02angular6 利用 ngContentOutlet 實現(xiàn)組件位置交換(重排)
這篇文章主要介紹了angular6 利用 ngContentOutlet 實現(xiàn)組件位置交換(重排),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11Angular5整合富文本編輯器TinyMCE的方法(漢化+上傳)
TinyMCE是一個輕量級的富文本編輯器,相對于CK編輯器更加精簡,但必須滿足絕大部分場景的需要。這篇文章主要介紹了Angular5整合富文本編輯器TinyMCE(漢化+上傳)的相關(guān)知識,需要的朋友可以參考下2020-05-05