Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >依赖于多个表单域的Angular2验证器

依赖于多个表单域的Angular2验证器
EN

Stack Overflow用户
提问于 2015-08-03 13:30:25
回答 15查看 99.4K关注 0票数 126

是否可以创建一个验证器,它可以使用多个值来确定我的字段是否有效?

例如,如果客户的首选联系方式是通过电子邮件,则电子邮件字段应为必填项。

谢谢。

已更新示例代码...

代码语言:javascript
运行
AI代码解释
复制
    import {Component, View} from 'angular2/angular2';
    import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';

    @Component({
        selector: 'customer-basic',
        viewInjector: [FormBuilder]
    })
    @View({
        templateUrl: 'app/components/customerBasic/customerBasic.html',
        directives: [formDirectives]
    })
    export class CustomerBasic {
        customerForm: ControlGroup;

        constructor(builder: FormBuilder) {
            this.customerForm = builder.group({
                firstname: [''],
                lastname: [''],
                validateZip: ['yes'],
                zipcode: ['', this.zipCodeValidator] 
                // I only want to validate using the function below if the validateZip control is set to 'yes'
            });
        }

        zipCodeValidator(control) {
            if (!control.value.match(/\d\d\d\d\d(-\d\d\d\d)?/)) {
                return { invalidZipCode: true };
            }
        }

    }
EN

回答 15

Stack Overflow用户

发布于 2016-01-03 23:39:50

在某种程度上重申其他人发布的方法,这是我创建不涉及多个组的FormGroup验证器的方式。

对于本例,只需提供passwordconfirmPassword字段的键名。

代码语言:javascript
运行
AI代码解释
复制
// Example use of FormBuilder, FormGroups, and FormControls
this.registrationForm = fb.group({
  dob: ['', Validators.required],
  email: ['', Validators.compose([Validators.required,  emailValidator])],
  password: ['', Validators.required],
  confirmPassword: ['', Validators.required],
  firstName: ['', Validators.required],
  lastName: ['', Validators.required]
}, {validator: matchingPasswords('password', 'confirmPassword')})

为了让Validators接受参数,它们需要返回一个参数为FormGroupFormControlfunction。在本例中,我将验证一个FormGroup

代码语言:javascript
运行
AI代码解释
复制
function matchingPasswords(passwordKey: string, confirmPasswordKey: string) {
  return (group: FormGroup): {[key: string]: any} => {
    let password = group.controls[passwordKey];
    let confirmPassword = group.controls[confirmPasswordKey];

    if (password.value !== confirmPassword.value) {
      return {
        mismatchedPasswords: true
      };
    }
  }
}

从技术上讲,如果我知道它们的键,我可以验证任何两个值,但我更喜欢将我的Validators命名为与它们返回的错误相同的名称。可以修改该函数以接受第三个参数,该参数表示返回的错误的键名。

更新于2016年12月6日 (v2.2.4)

完整示例:https://embed.plnkr.co/ukwCXm/

票数 153
EN

Stack Overflow用户

发布于 2016-02-26 02:23:21

Dave's answer非常非常有帮助。但是,稍微修改一下可能会对某些人有所帮助。

如果需要向Control字段添加错误,可以保留表单和验证器的实际结构:

代码语言:javascript
运行
AI代码解释
复制
// Example use of FormBuilder, ControlGroups, and Controls
this.registrationForm= fb.group({
  dob: ['', Validators.required],
  email: ['', Validators.compose([Validators.required,  emailValidator])],
  password: ['', Validators.required],
  confirmPassword: ['', Validators.required],
  firstName: ['', Validators.required],
  lastName: ['', Validators.required]
}, {validator: matchingPasswords('password', 'confirmPassword')})

不是在ControlGroup上设置错误,而是在实际字段上设置错误,如下所示:

代码语言:javascript
运行
AI代码解释
复制
function matchingPasswords(passwordKey: string, passwordConfirmationKey: string) {
  return (group: ControlGroup) => {
    let passwordInput = group.controls[passwordKey];
    let passwordConfirmationInput = group.controls[passwordConfirmationKey];
    if (passwordInput.value !== passwordConfirmationInput.value) {
      return passwordConfirmationInput.setErrors({notEquivalent: true})
    }
  }
}
票数 53
EN

Stack Overflow用户

发布于 2017-05-20 16:27:13

在为多个表单域实现验证器时,必须确保在更新每个表单控件时重新计算验证器。大多数示例都没有为这种情况提供解决方案,但这对于数据一致性和正确的行为非常重要。

请参阅我为Angular 2实现的自定义验证器,其中考虑到了这一点:https://gist.github.com/slavafomin/17ded0e723a7d3216fb3d8bf845c2f30

我使用otherControl.valueChanges.subscribe()侦听其他控件的更改,使用thisControl.updateValueAndValidity()在其他控件更改时触发另一轮验证。

我正在复制下面的代码,以供将来参考:

match-other-validator.ts

代码语言:javascript
运行
AI代码解释
复制
import {FormControl} from '@angular/forms';


export function matchOtherValidator (otherControlName: string) {

  let thisControl: FormControl;
  let otherControl: FormControl;

  return function matchOtherValidate (control: FormControl) {

    if (!control.parent) {
      return null;
    }

    // Initializing the validator.
    if (!thisControl) {
      thisControl = control;
      otherControl = control.parent.get(otherControlName) as FormControl;
      if (!otherControl) {
        throw new Error('matchOtherValidator(): other control is not found in parent group');
      }
      otherControl.valueChanges.subscribe(() => {
        thisControl.updateValueAndValidity();
      });
    }

    if (!otherControl) {
      return null;
    }

    if (otherControl.value !== thisControl.value) {
      return {
        matchOther: true
      };
    }

    return null;

  }

}

用法

下面是如何在反应式表单中使用它:

代码语言:javascript
运行
AI代码解释
复制
private constructForm () {
  this.form = this.formBuilder.group({
    email: ['', [
      Validators.required,
      Validators.email
    ]],
    password: ['', Validators.required],
    repeatPassword: ['', [
      Validators.required,
      matchOtherValidator('password')
    ]]
  });
}

更多最新的验证器可以在这里找到:moebius-mlm/ng-validators

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31788681

复制
相关文章
SpringMVC表单验证器的使用
本章讲解SpringMVC中怎么通过注解对表单参数进行验证。 SpringBoot配置 使用springboot, spring-boot-starter-web会自动引入 hiberante-validator, validation-api依赖。 在 WebMvcConfigurerAdapter实现类里面添加验证器及国际化指定资源文件。 @Override public Validator getValidator() { LocalValidatorFactoryBean validat
Java技术栈
2018/03/30
1.8K0
SpringMVC表单验证器的使用
Laravel Validation 表单验证(二、验证表单请求)
创建表单请求验证 面对更复杂的验证情境中,你可以创建一个「表单请求」来处理更为复杂的逻辑。表单请求是包含验证逻辑的自定义请求类。可使用 Artisan 命令 make:request 来创建表单请求类:
joshua317
2022/10/31
29.6K0
angularjs的表单验证
angularjs内置了常用的表单验证指令,比如min,require等。下面是演示:
MJ.Zhou
2018/07/31
1.4K0
angularjs的表单验证
Angularjs的表单验证
在AngularJS中,有许多用于验证的指令。我们将先学习几个最流行的内置指令,然后再创建一个自定义验证规则的指令。
星回
2018/08/02
2.2K0
angularjs的表单验证
angularjs内置了常用的表单验证指令,比如min,require等。下面是演示: <!DOCTYPE html> <html> <head> <meta charse
MJ.Zhou
2018/01/04
1.6K0
angularjs的表单验证
简单的表单验证
<head> <meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ /> <title>表单验证</title> <script language=”javascript” src=”include/form.js”> </script> </head> <body><form action=”#” method=”post” name=”form” id=”form”> 姓&nbsp;&nbsp;&nbsp;&
苦咖啡
2018/05/07
2.3K0
【HTML】HTML 表单 ⑤ ( form 表单域 )
从 input 表单 , textarea 文本域 , select 下拉菜单 中收集了用户信息 , 需要通过
韩曙亮
2023/03/30
4.2K0
【HTML】HTML 表单 ⑤ ( form 表单域 )
Angularjs 表单验证
<input name="id" ng-disabled="f_isEditMode()" class="form-control" ng-model="node.id" required placeholder="请输入系统唯一标识" ng-pattern="/^[\w\d_-]*$/"> <p>系统的唯一标识名称(格式:字母、数字、连字符、下划线) 如:mysql</p> <error-strings> <error-string on="my
问天丶天问
2018/06/13
3K0
formvalidation表单验证
官方文档:http://formvalidation.io var $formEntityProfileSearch = $("form[name=entityProfileSearch]"); var $formValidationEntityProfileSearch = $formEntityProfileSearch.data("formValidation"); //初始化表单验证 $formValidationEntityProfileSearch.revalidateField('compan
windseek
2018/05/15
3.1K0
Validate表单验证
validate 一、 validate的使用步骤 引入jquery.min.js 引入 jquery.validate.js 页面加载后对表单进行验证 $("#表单id名").validate({}) 在validate中的rules中编写验证规则(格式如下) 字段的name属性:“校验器”(tisps:一个输入框只有一个校验器的时候使用) 字段的name属性:{校验器:值,校验器:值}(tips:输入框需要有多个校验器的时候使用) 在validate中的messages中编写提示信息(tips格
Twcat_tree
2022/11/30
3.8K0
Validate表单验证
JavaScript 表单验证
JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证。
陈不成i
2021/07/19
3.2K0
Laravel表单验证
今天来说一下laravel框架的表单验证实例代码,下面一起来看看吧! 一、场景 用户前台登录页面,如下图 二、提交方式 AJAX提交 三、说明 1、laravel框架表单提交需要有CSRF验证 2、
申霖
2020/11/23
3.6K0
Laravel表单验证
angularjs 表单验证
一、常用的表单验证指令  1. 必填项验证 某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" required />   2. 最小长度 验证表单输入的文本长度是否大于某个最小值,在输入字段上使用指令ng-minleng= "{number}": <input type="text" ng-minlength="5" /> 3. 最大长度 验证表单输入的文本长度是否小于或等于某个最大值,在输入字段上使用指令ng-maxlength=
柴小智
2018/04/10
6.8K0
angularjs 表单验证
jquery 表单验证
("form :input.required").each(function(){
用户5760343
2019/10/10
3.7K0
jquery 表单验证
jsp表单验证
后面有代码,需要直接拿 toUpperCase()方法将字符串小写字符转换为大写 语法 public String toUpperCase() 或 public String toUpperCase(Locale locale) 参数 无 返回值 字符转换为大写后的字符串。 效果图如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE ht
天蝎座的程序媛
2022/11/18
3.2K0
jsp表单验证
html表单验证确认密码_简述html5的表单验证
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
3.6K0
html表单验证确认密码_简述html5的表单验证
Element表单验证
要加验证之前一定要确保已经写了 prop 属性,该属性是跟 rule 绑定在一起的,也可以在行内单独制定 rules。
leader755
2022/03/09
3.7K0
表单验证常用的正则
匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度
小闫同学啊
2019/07/18
1.7K0
bootstrap 表单验证 不为空验证
<!doctype html> <html> <head> <meta charset="utf-8"> <title>联想控股</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="css/bootstrap.css" rel="stylesheet" type="text/css"> <link href="css/bootstrapValidator.min.css" rel="stylesheet" type="text/css"> <script src="http://code.jquery.com/jquery.js"></script> <script src="js/bootstrap.min.js"></script> <script src="js/bootstrapValidator.min.js"></script> </head> <body>  <form role="form"> <div class="form-group"> <label>Username</label> <input type="text" class="form-control" name="username" /> </div> <div class="form-group"> <label>Email address</label> <input type="text" class="form-control" name="email" /> </div> <div class="form-group"> <button type="submit" name="submit" class="btn btn-primary">Submit</button> </div> </form> <script>
用户5760343
2019/07/07
8.8K0
【Laravel系统3.3】控制器与表单验证
在请求过程中,控制器往往是我们在做业务开发时绕不过的一环。从 MVC 理论的成熟到现代化的开发过程中,控制器一直扮演着重要的角色。可以说,我们可以不要前端(只做接口),可以不要模型(直接读取数据),但控制器却是必不可少的。当然,在正式的 MVC 模型中,视图是可以直接和模型交互的,由此,也引申出了 MVP 模型,其中的这个 P 就是强化控制器的作用,让模型和视图解耦。其实我们大部分正规的开发,都是基于这个 MVP 的,很少会直接让视图和模型去交互。
硬核项目经理
2023/03/03
8.8K0
【Laravel系统3.3】控制器与表单验证

相似问题

依赖于另一个表单域的Angular2验证器

10

jQuery验证多个表单域

21

根据多个约束验证表单域

10

条件表单验证器Angular2

10

Javascript表单验证-多个大于0的表单域

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档