当前位置: 移动技术网 > IT编程>脚本编程>AngularJs > angular4中关于表单的校验示例

angular4中关于表单的校验示例

2017年12月12日  | 移动技术网IT编程  | 我要评论

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

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

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"

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网