(十七)、Angular4.0 响应式表单校验

野性酷女 2022-05-27 00:12 283阅读 0赞

一、在app下新建validator目录,创建一个ValidatorScript的ts类型文件,用来编写检验方法

  1. import {FormControl, FormGroup} from '@angular/forms';
  2. import {Observable} from 'rxjs/Observable';
  3. import 'rxjs/add/observable/of';
  4. import 'rxjs/add/operator/delay';
  5. // 手机号码校验
  6. export function mobileVlidator(control: FormControl): any {
  7. const myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
  8. const valid = myreg.test(control.value);
  9. console.log('mobile的校验结果' + valid);
  10. return valid ? null : {mobile: true};
  11. }
  12. // 手机号码异步校验
  13. export function mobileAsyncVlidator(control: FormControl): any {
  14. const myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
  15. const valid = myreg.test(control.value);
  16. console.log('mobile的校验结果' + valid);
  17. return Observable.of(valid ? null : {mobile: true}).delay(5000);
  18. }
  19. // 确认密码验证
  20. export function equalsValidator(group: FormGroup): any {
  21. const password: FormControl = group.get('password') as FormControl;
  22. const pConfirm: FormControl = group.get('pConfirm') as FormControl;
  23. const valid: boolean = (password.value === pConfirm.value);
  24. console.log('密码校验结果' + valid);
  25. return valid ? null : {equals: true};
  26. }

二、修改reactive-regist.component.ts,添加校验

  1. import { Component, OnInit } from '@angular/core';
  2. import {AbstractControl, FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms';
  3. import {equalsValidator, mobileAsyncVlidator, mobileVlidator} from '../validator/ValidatorScript';
  4. @Component({
  5. selector: 'app-reactive-regist',
  6. templateUrl: './reactive-regist.component.html',
  7. styleUrls: ['./reactive-regist.component.css']
  8. })
  9. export class ReactiveRegistComponent implements OnInit {
  10. formModel: FormGroup;
  11. // 定义响应式表单的数据结构
  12. constructor(fb: FormBuilder) {
  13. this.formModel = fb.group({
  14. username: ['', [Validators.required, Validators.minLength(6)]],
  15. mobile : ['', mobileVlidator, mobileAsyncVlidator],
  16. passwordsGroup: fb.group({
  17. password: ['', [Validators.minLength(6)]],
  18. pConfirm: ['']
  19. }, {validator: equalsValidator})
  20. });
  21. }
  22. // 响应式表单校验
  23. validateForm(control: AbstractControl): {[key: string]: any} {
  24. return null;
  25. }
  26. onSubmit() {
  27. // const isVaild = this.formModel.get('username').valid;
  28. // console.log('username校验结果为: ' + isVaild);
  29. if (this.formModel.valid) {
  30. console.log(this.formModel.value);
  31. }
  32. }
  33. ngOnInit() {
  34. }
  35. }

三、reactive-regist.component.html

  1. <form [formGroup]="formModel" (submit)="onSubmit()">
  2. <div>用户名:<input type="text" formControlName="username"></div>
  3. <div [hidden]="!formModel.hasError('required','username')">
  4. 用户名不能为空
  5. </div>
  6. <div [hidden]="!formModel.hasError('minlength','username')">
  7. 用户名最小长度是6
  8. </div>
  9. <div>手机号:<input type="text" formControlName="mobile"></div>
  10. <div [hidden]="!formModel.hasError('mobile','mobile')">
  11. 请输入正确的手机号
  12. </div>
  13. <div formGroupName="passwordsGroup">
  14. <div>密码:<input type="password" formControlName="password"></div>
  15. <div [hidden]="!formModel.hasError('minlength',['passwordsGroup','password'])">
  16. 密码最小长度是6
  17. </div>
  18. <div>确认密码:<input type="password" formControlName="pConfirm"></div>
  19. <div [hidden]="!formModel.hasError('equals','passwordsGroup')">
  20. 密码不匹配
  21. </div>
  22. </div>
  23. <button type="submit">提交</button>
  24. <br>
  25. {
  26. {formModel.status}}
  27. </form>

四、访问localhost:4200测试

五、状态字段

  • touched和untouched 是否获取焦点 示例:(把用户名的两个校验用一个div包含起来,鼠标失去焦点后显示)



    用户名不能为空


    用户名最小长度是6

  • pristine和dirty (如果字段的值改变过,则pristine为false,dirty为true) (把手机号的校验用一个div包含起来,鼠标失去焦点后不显示,只有在输入字符后才有校验提示)



    请输入正确的手机号

  • pending,当一个字段处于异步校验时,属性为true,这个时候可以显示一段文字或图片,来告诉用户正在校验(在手机号码验证下面添加一个div,用于peding示例)


    校验手机号码中…

六、

七、

八、

九、

十、

十一、

十二、

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Angular2响应

    本文将半翻译半总结的讲讲ng2官网的另一个未翻译高级教程页面。 [原文地址。][Link 1] 文章目的是使用ng2提供的响应式表单技术快速搭出功能完善丰富的界面表单组件。

    相关 angular7+ngzorro响应验证

    使用响应式表单在开发的过程中,经常会用到。使用响应式表单的不仅能够提高开发效率,并且还能有效减少冗余的代码,在表单校验的时候也更方面,并且结合ngzorro进行表单校验效果更完