欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

angular4中关于表单的校验示例

程序员文章站 2022-03-20 22:16:47
本章中介绍响应式表单的创建及表单输入值的校验,对于模板表单就略过。 一、使用响应式表单的步骤 1、在模块(一般是app.module.ts)中引入reactivef...

本章中介绍响应式表单的创建及表单输入值的校验,对于模板表单就略过。

一、使用响应式表单的步骤

1、在模块(一般是app.module.ts)中引入reactiveformsmodule
2、在组件的ts文件中使用响应式表单

import { formgroup, formbuilder, validators, formcontrol } from '@angular/forms';
export class reactiveformcomponent implements oninit {
  private myform: formgroup;
  constructor(private fb: formbuilder) {
    this.createform();
  }

  ngoninit() {
  }
  // 创建表单元素
  createform() {
    this.myform = this.fb.group({
      username: ['', [validators.required, validators.minlength(3), validators.maxlength(6)]],
      mobile: ['', [validators.required]],
      password: this.fb.group({
        pass1: [''],
        pass2: ['']
      })
    });
  }
  // 提交表单函数
  postdate() {
    /**
     * valid:是否有效
     * invalid:无效
     * dirty:脏
     * status:状态
     * errors:显示错误
     */
    if(this.myform.valid){
      console.log(this.myform.value);
    }
  }
}

3、在组件的html页面中使用

<form [formgroup]="myform" (ngsubmit)="postdate()">
  <div class="form-group">
    <label for="username">用户名:</label>
    <input type="text" placeholder="请输入用户名" class="form-control" id="username" formcontrolname="username" />
  </div>
  <div class="form-group">
    <label for="mobile">手机号码:</label>
    <input type="text" placeholder="请输入手机号码" class="form-control" id="mobile" formcontrolname="mobile"/>
  </div>
  <div formgroupname="password" style="border:none;">
    <div class="form-group">
      <label>密码:</label>
      <input type="password" class="form-control" placeholder="请输入密码" formcontrolname="pass1" />
    </div>
    <div class="form-group">
      <label>确认密码:</label>
      <input type="password" class="form-control" placeholder="请再次输入密码" formcontrolname="pass2" />
    </div>
  </div>
  <div class="form-group">
    <input type="submit" value="提交" class="btn btn-warning" [disabled]="!myform.valid" />
  </div>
</form>

二、使用表单校验数据

1、angular中自带了三个常见的表单校验的是在validators中的required,minlength,maxlength
2、自定义表单校验器(其实就一个函数,函数的参数是当前需要校验的行,返回一个任意对象)

**格式**
export function fnname(control:formcontrol|formgroup):any{

}

3、响应式表单字段中可以写三个值,第一个是返显到页面上的,第二个参数是校验器(可以是一组),第三个参数异步校验(常见判断手机号码,用户名是否重复注册)

三、自定义一个校验方法的步骤

1、把项目中需要用的校验器单独写一个文件

import { formcontrol, formgroup } from '@angular/forms';
/**
 * 自定义验证器(其实就是一个函数,一个返回任意对象的函数)
 * 传递的参数是当前需要验证的表单的formcontrol
 * 通过传递的参数获取当前表单输入的值
 */
export function mobilevalidator(control: formcontrol): any {
  console.dir(control);
  // 获取到输入框的值
  const val = control.value;
  // 手机号码正则
  const mobiereg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
  const result = mobiereg.test(val);
  return result ? null : { mobile: { info: '手机号码格式不正确' } };
}

2、使用自己定义的校验器

createform() {
  this.myform = this.fb.group({
    username: ['', [validators.required, validators.minlength(3), validators.maxlength(6)]],
    mobile: ['', [validators.required, mobilevalidator]],
    password: this.fb.group({
      pass1: [''],
      pass2: ['']
    })
  });
}

3、定义一个密码组的校验

// 定义一个密码组的验证方法
export function passvalidator(controlgroup: formgroup): any {
  // 获取密码输入框的值
  const pass1 = controlgroup.get('pass1').value as formcontrol;
  const pass2 = controlgroup.get('pass2').value as formcontrol;
  console.log('你输入的值:', pass1, pass2);
  const isequle: boolean = (pass1 === pass2);
  return isequle ? null : { passvalidator: { info: '两次密码不一致' } };
}
 

4、使用

createform() {
  this.myform = this.fb.group({
    username: ['', [validators.required, validators.minlength(3), validators.maxlength(6)]],
    mobile: ['', [validators.required, mobilevalidator]],
    password: this.fb.group({
      pass1: [''],
      pass2: ['']
    }, {validator: passvalidator})
  });
}

四、关于前端页面中错误的显示

1、页面显示错误

<div class="form-group">
  <label for="username">用户名:</label>
  <input type="text" placeholder="请输入用户名" class="form-control" id="username" formcontrolname="username" />
  <!-- 当输入框没有访问的时候或者合法的时候不显示 -->
  <div [hidden]="myform.get('username').valid || myform.get('username').untouched">
    <p [hidden]="!myform.haserror('required','username')">用户名必填的</p>
    <p [hidden]="!myform.haserror('minlength','username')">用户名长度过短</p>
    <p [hidden]="!myform.haserror('maxlength','username')">用户名长度太长</p>
  </div>
</div>
<div class="form-group">
  <label for="mobile">手机号码:</label>
  <input type="text" placeholder="请输入手机号码" class="form-control" id="mobile" formcontrolname="mobile"/>
  <div [hidden]="myform.get('mobile').valid || myform.get('mobile').untouched">
    <p [hidden]="!myform.haserror('mobile', 'mobile')">{{myform.geterror('mobile', 'mobile')?.info}}</p>
  </div>
</div>
<div formgroupname="password" style="border:none;">
  <div class="form-group">
    <label>密码:</label>
    <input type="password" class="form-control" placeholder="请输入密码" formcontrolname="pass1" />
  </div>
  <div class="form-group">
    <label>确认密码:</label>
    <input type="password" class="form-control" placeholder="请再次输入密码" formcontrolname="pass2" />
  </div>
  <!-- 对于group可以不在外面加一层判断 -->
  <div>
    <p [hidden]="!myform.haserror('passvalidator','password')">
      {{myform.geterror('passvalidator','password')?.info}}
    </p>
  </div>
</div>

2、定义样式文件

.ng-touched:not(form),.ng-invalid:not(form) {
  border: 1px solid #f00;
}

.ng-valid:not(form),.ng-untouched:not(form) {
  border: 1px solid #ddd;
}
p{
  color:#f00;
}

五、自定义class显示错误

1、在input输入框上写上

表示该字段无效且触碰过就添加这个class=”error”

 [class.error]="myform.get('username').invalid && myform.get('username').touched"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。