本文主要给大家介绍如何判断验证器的结果。在这里,我们就来看看怎样实现一个自定义的验证器。
目标
我们要实现一个验证手机号的验证器,使用的实例还是基于之前的文章里面的实例,也就是用户信息输入的表单页面。我们在手机号的元素上添加一个验证手机号的验证器。然后,如果手机号验证失败,就显示一个错误,页面如下:
这部分教程的代码可以从github获取:
git clone
https://github.com/Mavlarn/angular2-forms-tutorial
如果要运行,进入项目目录,运行下面的命令安装依赖然后运行测试服务器:
cd angular2-forms-tutorial git checkout model-driven # 检出该文所使用的tag npm install npm start
实现验证器
在Angular2中,实现一个验证器非常简单,就是一个方法就可以,该方法的参数是一个FormControl,结果是一个错误对象或者null。用TypeScript接口表示,就是这样:
interface Validator<T extends FormControl> { (c:T): {[error: string]:any}; }
如果是对类似Java这样的面向对象语言比较了解的话,上面的接口定义就很容易理解。其中<T extends FormControl>是指这个方法中用到一个泛型T,它是一个继承自FormControl的对象。(c:T): {[error: string]:any};这是一个lambda表达式的方法定义,参数c的类型为T,这个方法返回一个对象。
我们创建一个名为mobile.validator.ts的文件,它的内容如下:
import { FormControl } from '@angular/forms'; export function validateMobile(c: FormControl) { let MOBILE_REGEXP = /^1[0-9]{10,10}$/; return MOBILE_REGEXP.test(c.value) "htmlcode"><p *ngIf="userForm.controls.mobile">必须输入电话</p>userForm.controls.mobile就是表单中手机号这个控件,required是required验证器对应的key,当required验证器验证失败时,就会在errors里面添加一个值:
{ required: {valid: false} }所以,我们实现的自定义的验证器,也要把验证结果用验证器的名字作为key,放到errors里面,就是这样:
{ validateMobile: {valid: false} }这样,我们就能够在页面中用跟之前同样的方式来获得这个验证器的验证结果。
在模型驱动的表单里添加验证器
接下来,我们把我们实现的验证器添加到我们的表单里,先加到模型驱动的表单里:
import { validateMobile } from '../validators/mobile.validator'; export class ReactiveFormsComponent implements OnInit { this.userForm = this.formBuilder.group({ // ... 省略其他控件 mobile: [13800138001, [Validators.required, Validators.minLength(11), Validators.maxLength(11), validateMobile]] }); ... }上面的代码省略了其他的部分,完整的代码,请参考github。
在上面的代码中,我们引入了之前实现的自定义的验证器,然后在表单控件创建代码中,对mobile控件加了一个validateMobile。
这样,我们在页面上添加相应的验证结果信息:
<p *ngIf="userForm.controls.mobile.errors">电话号码格式不正确</p>这样就完成了验证器,以及在页面显示验证结果,就这么简单。
在模板驱动的表单里添加验证器
但是,如果我们的表单不是在组件里用模型驱动的方式创建的,而是在页面上用html元素创建的,那么使用自定义的验证器就稍微麻烦一点。
在一个模板驱动的表单里,我们是这样使用验证器的:
<input type="text" name="mobile" [(ngModel)]="user.mobile" #mobile="ngModel" required minlength="11" maxlength="11"> <span *ngIf="mobile.valid">有效</span> <div [hidden]="mobile.valid || mobile.pristine"> <p *ngIf="mobile.errors">电话长度必须为11</p> <p *ngIf="mobile.errors">必须输入姓名</p> </div>也就是在input输入元素的属性中添加验证器。那么,我们要实现自己的验证器在表单里面使用,除了上面的验证器方法里面,还需要2件事情:
我们需要将这个验证器定义成一个指令Directive,这样Angular在解析这段html的时候,会识别我们自定义的验证器指令。
我们还需要Angular的验证器调用我们的验证方法。
所以,在之前的mobile.validator.ts文件里,添加下面的指令定义:@Directive({ selector: '[validateMobile][ngModel]' }) export class MobileValidator {}这段代码很简单,就是用@Directive标签定义了一个指令MobileValidator,它作用的元素是同时具有validateMobile和ngModel属性的元素。这样,我们就可以在手机号的元素上添加一个属性,来使这个验证器指令起作用。
然后,我们还需要Angular的验证器框架能够调用我们的验证方法,这就需要NG_VALIDATORS。我们修改上面的验证器的指令定义如下:@Directive({ selector: '[validateMobile][ngModel]', providers: [ { provide: NG_VALIDATORS, useValue: validateMobile, multi: true } ] }) export class MobileValidator {}这样Angular的验证器就能够将validateMobile方法应用在这个指令上。
最后,我们再把这个新的指令,添加到AppModule的declarations里面,就可以在页面上使用这个验证器了。
最后,页面上使用验证器的代码如下:
<input type="text" name="mobile" [(ngModel)]="user.mobile" #mobile="ngModel" required minlength="11" maxlength="11" validateMobile> <span *ngIf="mobile.valid">有效</span> <div [hidden]="mobile.valid || mobile.pristine"> <p *ngIf="mobile.errors">电话长度必须为11</p> <p *ngIf="mobile.errors">必须输入姓名</p> <p *ngIf="mobile.errors">电话号码格式不正确</p> </div>以上所述是小编给大家介绍的Angular2表单自定义验证器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
angular2,表单验证
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]