这部分教程的代码可以从github获取:
git clone
https://github.com/Mavlarn/angular2-forms-tutorial
如果要运行,进入项目目录,运行下面的命令安装依赖然后运行测试服务器:
cd angular2-forms-tutorialgit checkout model-driven # 检出该文所使用的tagnpm installnpm start实现验证器
interface Validator<T extends FormControl> {(c:T): {[error: string]:any};}如果是对类似Java这样的面向对象语言比较了解的话,上面的接口定义就很容易理解。其中<T extends FormControl>是指这个方法中用到一个泛型T,它是一个继承自FormControl的对象。(c:T): {[error: string]:any};这是一个lambda表达式的方法定义,参数c的类型为T,这个方法返回一个对象。
import { FormControl } from "@angular/forms";export function validateMobile(c: FormControl) {let MOBILE_REGEXP = /^1[0-9]{10,10}$/;return MOBILE_REGEXP.test(c.value) ? null : {validateMobile: {valid: false}}}在这个验证方法里,参数c的类型为FormControl,也就是表单控件,他有一个value属性,存放当前的值。我们使用正则表达式,来判断这个值是否合法。如果不合法,就返回一个对象。
<p *ngIf="userForm.controls.mobile?.errors?.required">必须输入电话</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。
<p *ngIf="userForm.controls.mobile.errors?.validateMobile">电话号码格式不正确</p>这样就完成了验证器,以及在页面显示验证结果,就这么简单。
<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?.minlength || mobile.errors?.maxlength">电话长度必须为11</p><p *ngIf="mobile.errors?.required">必须输入姓名</p></div>也就是在input输入元素的属性中添加验证器。那么,我们要实现自己的验证器在表单里面使用,除了上面的验证器方法里面,还需要2件事情:
@Directive({selector: "[validateMobile][ngModel]"})export class MobileValidator {}这段代码很简单,就是用@Directive标签定义了一个指令MobileValidator,它作用的元素是同时具有validateMobile和ngModel属性的元素。这样,我们就可以在手机号的元素上添加一个属性,来使这个验证器指令起作用。
@Directive({selector: "[validateMobile][ngModel]",providers: [{ provide: NG_VALIDATORS, useValue: validateMobile, multi: true }]})export class MobileValidator {}这样Angular的验证器就能够将validateMobile方法应用在这个指令上。
<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?.minlength || mobile.errors?.maxlength">电话长度必须为11</p><p *ngIf="mobile.errors?.required">必须输入姓名</p><p *ngIf="mobile.errors?.validateMobile">电话号码格式不正确</p></div>以上所述是小编给大家介绍的Angular2表单自定义验证器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!