angular 实现同步验证器跨字段验证的方法

几乎每个web应用都会用到表单,Angular 为我们提供了几个内置 validators (验证器),但在实际工作中为了满足项目需求,我们经常需要为应用添加一些自定义验证功能。

angular内置验证器

  • required - 表单控件值非空
  • email - 表单控件值的格式是 email
  • minlength - 表单控件值的最小长度
  • maxlength - 表单控件值的最大长度
  • pattern - 表单控件的值需匹配 pattern 对应的模式(正则表达式)

需求:设置成绩占比时,如果总占比不是100%,则无法通过验证。

分析:需求很简单,只需要写一个验证器即可,由于不需要访问后台,且验证器与三个字段有关,所以是同步跨字段验证。

实现验证器

首先,去官网上找示例代码:

export const identityRevealedValidator: ValidatorFn = (control: FormGroup): ValidationErrors | null => {
 const name = control.get('name');
 const alterEgo = control.get('alterEgo');

 return name && alterEgo && name.value === alterEgo.value ? { 'identityRevealed': true } : null;
};

解释:这个身份验证器实现了 ValidatorFn 接口。它接收一个 Angular 表单控件对象作为参数,当表单有效时,它返回一个 null,否则返回 ValidationErrors 对象。

从上可知,所谓跨字段,就是从验证表单单个控件formControl变成了验证整个表单formGroup了,而formGroup的每个字段就是formControl。

明白了这个原理,就是根据需求进行改写:

  // 判断总占比是否等于100
  export const scoreWeightSumValidator: ValidatorFn = (formGroup: FormGroup): ValidationErrors | null => {
  const sumLegal = formGroup.get('finalScoreWeight')
    .value + formGroup.get('middleScoreWeight')
    .value + formGroup.get('usualScoreWeight')
    .value === 100;
    // 如果是,返回一个 null,否则返回 ValidationErrors 对象。
  return sumLegal ? null : {'scoreWeightSum': true};
};

到此,验证器已经写完。

添加到响应式表单

给要验证的 FormGroup 添加验证器,就要在创建时把一个新的验证器传给它的第二个参数。

  ngOnInit(): void {
  this.scoreSettingAddFrom = this.fb.group({
    finalScoreWeight: [null, [Validators.required, scoreWeightValidator]],
    fullScore: [null, [Validators.required]],
    middleScoreWeight: [null, [Validators.required, scoreWeightValidator]],
    name: [null, [Validators.required]],
    passScore: [null, [Validators.required]],
    priority: [null, [Validators.required]],
    usualScoreWeight: [null, [Validators.required, scoreWeightValidator]],
  }, {validators: scoreWeightSumValidator});
}

添加错误提示信息

我使用的是ng-zorro框架,当三个成绩占比均输入时,触发验证

  <nz-form-item nz-row>
  <nz-form-control nzValidateStatus="error" nzSpan="12" nzOffset="6">
    <nz-form-explain
      *ngIf="scoreSettingAddFrom.errors?.scoreWeightSum &&
       scoreSettingAddFrom.get('middleScoreWeight').dirty &&
       scoreSettingAddFrom.get('finalScoreWeight').dirty &&
       scoreSettingAddFrom.get('usualScoreWeight').dirty">成绩总占比需等于100%!
    </nz-form-explain>
  </nz-form-control>
</nz-form-item>

效果:

总结

总的来说这个验证器实现起来不算很难,就是读懂官方文档,然后根据自己的需求进行改写。

参考文档:angular表单验证 跨字段验证

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

(0)

相关推荐

  • Angular2 自定义表单验证器的实现方法

    废话 最近由于项目上需要用到表单验证,前面直接通过 (input) 事件进行数据检查,但是不好和自带的验证器统一,而且也不正统.于是打算研究一下自定义验证器,网上类似的文章很多,但是自己在实现的过程中还是遇到了一些问题.于是还是啰嗦的自己写一篇文章. 正文 这里有官方文档:验证响应式表单,用户的视觉提示,自定义验证器,这篇文章是根据这些文档所来(前面两者就不再赘述比较简单,也说的比较清楚) Angular支持的内置validate属性: required- 设置表单控件值是非空的 email -

  • Angular2表单自定义验证器的实现

    本文主要给大家介绍如何判断验证器的结果.在这里,我们就来看看怎样实现一个自定义的验证器. 目标 我们要实现一个验证手机号的验证器,使用的实例还是基于之前的文章里面的实例,也就是用户信息输入的表单页面.我们在手机号的元素上添加一个验证手机号的验证器.然后,如果手机号验证失败,就显示一个错误,页面如下: 这部分教程的代码可以从github获取: git clone https://github.com/Mavlarn/angular2-forms-tutorial 如果要运行,进入项目目录,运行下面

  • angular 实现同步验证器跨字段验证的方法

    几乎每个web应用都会用到表单,Angular 为我们提供了几个内置 validators (验证器),但在实际工作中为了满足项目需求,我们经常需要为应用添加一些自定义验证功能. angular内置验证器 required - 表单控件值非空 email - 表单控件值的格式是 email minlength - 表单控件值的最小长度 maxlength - 表单控件值的最大长度 pattern - 表单控件的值需匹配 pattern 对应的模式(正则表达式) 需求:设置成绩占比时,如果总占比不

  • Angular跨字段验证器中如何直接调用其它独立的验证器

    目录 跨字段验证 使用独立的验证器 总结 在angular中关于表单动态验证的一种新思路一文中我们给出了Angular项目进行字段校验的三种方法.本文我们将重点围绕第一种方法展开讨论. 假设有如下应用: 该应用的功能是对输入的数值的奇偶数进行判断,如果满足条件,则启用Submit按钮,否则不启用. 跨字段验证 由于对输入数值的校验是根据输入类型来区分的,所以这里我们需要一个跨输入类型及输入数值的验证器: ngOnInit(): void { this.formGroup.setValidator

  • 为你的 Laravel 验证器加上多验证场景的实现

    前言 在我们使用 laravel 框架的验证器,有的时候需要对表单等进行数据验证,当然 laravel 也为我们提供了 Illuminate\Http\Request 对象提供的 validate 方法 以及 FormRequest 和 Validator. FormRequest 通过新建文件将我们的验证部分单独分开,来避免控制器臃肿.如果验证失败,就会生成一个让用户返回到先前的位置的重定向响应.这些错误也会被闪存到 Session 中,以便这些错误都可以在页面中显示出来.如果传入的请求是 A

  • django Model层常用验证器及自定义验证器详解

    在Django中,对数据进行校验有两种方式:一种是通过Form校验,一种是通过Model校验.在此,我对Model中的校验方法做下记录. 示例之前补充以下几点: 1.Django数据校验方式分为以下三步: Model.clean_fields() 验证字段基本规则比如长度格式等: Model.clean() 可自定义验证条件和报错信息: Model.validate_unique() 为验证添加的唯一性约束. 2.此三步验证通过调用full_claen(exclude=None, validat

  • angular 表单验证器验证的同时限制输入的实现

    angular里面对于表单验证,设置了很多指令. 也就是说不用自己写一些逻辑,直接绑定指令就行. ng-app     启动你angular的模块 ng-controller 控制器,启动你angualr里面的逻辑代码作用在页面上 ng-options  循环你select里面的option标签,很好用的 ng-submit,表单提交执行的 novalidate  表单form配合后期检测的 ng-model  实现双数据绑定 ng-show 根据一定的逻辑实现显示 ng-cloak 绑定在节点

  • Django模型验证器介绍与源码分析

    前言 在Django的模型字段参数中,有一个参数叫做validators,这个参数是用来指定当前字段需要使用的验证器,也就是对字段数据的合法性进行验证,比如大小.类型等. Django的验证器可以分为模型相关的验证器和表单相关的验证器,它们基本类似,但在使用上有区别. 本文讨论的是模型相关的验证器. 一.自定义验证器 一个验证器其实就是一个可调用的对象(函数或类),接收一个初始输入值作为参数,对这个值进行一系列逻辑判断,如果不满足某些规则或者条件,则表示验证不通过,抛出一个ValidationE

  • ThinkPHP5 验证器的具体使用

    前言: 我们在做API开发的时候,我们会接受客户端传来的参数,大家都知道这个参数是不可信的,我们后端开发人员必须对这个参数进行验证.我在之前的开发中只是知道tp5的验证器,并不知道他的用途,因为之前的开发验证,往往都是基于模型字段进行的验证.而验证器更适用与API开发,今天就简单讲下验证器的使用 目录: 创建验证器 书写单独验证器 调用验证 1.创建验证器 首先我们需要一个文件夹来存放我们的验证器,我们在模块下创建一个同控制器平级的文件夹,取名为validate 然后我们就可以来建立验证器了,我

  • 详解vue-validator(vue验证器)

    官方文档:http://vuejs.github.io/vue-validator/zh-cn/index.html github项目地址:https://github.com/vuejs/vue-validator 单独使用vue-validator的方法见官方文档,本文结合vue-router使用. 安装验证器 不添加自定义验证器或者无需全局使用的公用验证器,在main.js中安装验证器,使用 CommonJS 模块规范, 需要显式的使用 Vue.use() 安装验证器组件. import

  • Yii2验证器(Validator)用法分析

    本文实例讲述了Yii2验证器(Validator)用法.分享给大家供大家参考,具体如下: 先看一下验证器的使用. public function rules() { return [ [['email', 'password'], 'required'], ['password', 'string', 'min'=>6], ]; } 如上所示,验证器主要使用在rules里面,对当前model里面的属性值进行验证以检查是否满足某种要求. 验证器使用格式: 书写格式为:[需要验证的属性,验证器名称,

随机推荐