Angular 4 验证器可同时检查 2 个控件

2024-03-23

我有一个带有 2 个控件(port_start 和 port_end)的反应式表单,它们具有以下要求:

  • 两者都必须有一个值
  • 它们的值必须介于 0 到 65535 之间
  • port_start 值必须小于 port_end 值

这是我到目前为止所尝试的:

[...]
this.formModel.addControl('port_start', 
  new FormControl(object.port_start ? object.port_start : 0, 
  [Validators.required, Validators.min(0), Validators.max(65535), this.minMaxValidator('port_start', 'port_end').bind(this)]));

this.formModel.addControl('port_end', 
  new FormControl(object.ort_end ? object.port_end : 0, 
  [Validators.required, Validators.min(0), Validators.max(65535), this.minMaxValidator('port_start', 'port_end').bind(this)]));
[...]

这是自定义验证器函数:

minMaxValidator = function(startControl : string, endControl : string): ValidatorFn {
  return (control: FormControl): {[key: string]: any} => {
    let valid = true;
    let valStart = 0;
    let valEnd = 0;

    if(this.formModel.controls[startControl] && this.formModel.controls[endControl]) {
      valStart = <number>this.formModel.controls[startControl].value;

      valEnd = <number>this.formModel.controls[endControl].value;
    }

    valid = valEnd >= valStart;

    return valid ? null : { minmax : true };
  };
}

除了这个问题之外,这工作正常:

  • 假设我在“port_start”字段中输入“2”。 Angular 将其标记为无效,因为它大于“port_end”的值(默认为 0)。如果我在“port_end”字段中输入“5”,应用程序仍将“port_start”显示为无效,尽管现在它是正确的。

我知道问题是每次更改另一个字段的值时都需要重新检查关联字段,但我不知道该怎么做。

有任何想法吗?谢谢,


The min, max and required验证器可以保持原样。如果要根据一个控件的值验证另一个控件,则需要将验证提升到父控件。

import { Component } from '@angular/core';
import { ValidatorFn, FormBuilder, FormGroup, Validators } from '@angular/forms';

const portStartEnd: ValidatorFn = (fg: FormGroup) => {
   const start = fg.get('portStart').value;
   const end = fg.get('portEnd').value;

   return start && end && start < end ? null : { startEnd: true };
}

@Component({
  selector: 'my-app',
  template: `
   <input [formControl]="form.get('portStart')" type="number" >
   <input [formControl]="form.get('portEnd')" type="number" >

   {{ form.valid }}
  `,
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  form: FormGroup;

  constructor(private fb: FormBuilder) {
    this.form = this.fb.group({
      portStart: [null, [Validators.required, Validators.min(0), Validators.max(65535)]],
      portEnd: [null, [Validators.required, Validators.min(0), Validators.max(65535)]]
    }, { validator: portStartEnd } );
  }
}

现场演示 https://stackblitz.com/edit/angular-gupqvu

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 4 验证器可同时检查 2 个控件 的相关文章

随机推荐

  • 通过 Javascript 修改第 n 个子级

    是否可以使用纯js动态修改css nth child属性 tile nth child 10n 1 clear both 例如 像这样使用 js 添加 正如Pariket Thakur所说 你可以使用document querySelect
  • Spring Data (Spring Boot) 和 Joda Time 字段映射的问题

    我有一些带有 Joda DateTime 字段的实体 当尝试启动应用程序时 我收到以下错误 org springframework beans factory BeanCreationException Error creating bea
  • Hibernate Criteria 按子记录计数排序

    我有两个类 新闻和评论 它们之间具有一对多关联 我正在使用 Hibernate Criteria 从数据库中获取新闻 我希望我的新闻按照评论数排序 session createCriteria News class n criteria c
  • sql select语句给出列错误

    当我使用 SELECT order id from order where order id U687678601 我收到错误 错误 1054 未知列 where 子句中的 U687678601 但是当我输入时 SELECT order i
  • 是否有一个包含所有 Bootstrap 元素的巨大“资产页面”,我可以重新设置样式? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 http twitter github com bootstrap base css html htt
  • 在android的子目录中创建文件

    是否可以使用android中的openFileOutput方法在 data data packagename files 目录下创建的子目录中创建文件 即 data data packagename files 目录中有一个名为 text
  • Kohana——命令行

    我正在尝试在我的 Web 应用程序中 假分叉 一个进程 通过 SMTP 发送电子邮件 并且该应用程序是基于 Kohana 构建的 command test email exec php index php command gt dev nu
  • django-orm 不区分大小写的顺序

    我知道 我可以从 DJango ORM 运行不区分大小写的搜索 喜欢 User objects filter first name contains jake User objects filter first name contains
  • Android Compose 设置视图高度(以像素为单位而不是 dp)

    我想以像素而不是 dp 为单位设置视图高度 Box modifier Modifier height 100 dp 在此示例中 框的高度设置为 100 dp 并且修改器函数仅接受 dp 如何设置 Box 的高度 以像素为单位 Kilian
  • 在 Swift 中链接多个异步函数

    我正在尝试编写一系列函数 在要求用户确认某些内容之前验证用户的信息 想象一个购物应用程序 我首先必须检查用户是否添加了卡 然后我必须检查他们是否有足够的余额 然后我可以要求他们确认付款 我可以编写异步方法来检查卡 例如 func check
  • 使用 Javascript 生成高质量 PDF (jspdf+html2canvas)

    我一直在尝试通过单击页面上的按钮从 HTML 页面转换并生成 PDF 该按钮会使用两个流行的插件自动生成并强制下载页面的 PDF JSPDF HTML2Canvas 到目前为止 一切正常 但生成的 PDF 总是模糊且质量不高 导入 js 文
  • 这些 switch 语句有哪些替代方案?

    刚刚制作了这个极其简单的 GPA 计算器 想知道如何使用循环来避免大量的 switch 语句 我对 Java 很陌生 只是寻求一些建议 非常感谢任何其他改进程序的方法 预先感谢各位 package helloPackage import j
  • 出于好奇,学习Android开发

    最近我一直在考虑开发一些基本的android应用程序 这只是出于个人兴趣 请指导我从哪里开始 我需要什么工具以及指向某些 pdf 等的任何指示 我的背景 1 C语言嵌入式软件开发人员 2 有一些从事 Flex 工作的机会 因此熟悉eclip
  • RXJS 处理两个不同的事件,其中第一个事件必须取消第二个事件

    rxjs 对我来说非常具有挑战性 我发现自己一直在尝试解决这个问题 我在堆栈上找到的最接近的解决方案是使用合并运算符 这里是link https stackoverflow com questions 45495188 rxjs frome
  • 在后台运行时查看随机 ngrok URL

    当我启动 ngrok 客户端时 ngrok tcp 22它在前台运行 我可以看到随机生成的转发URL 例如tcp 0 tcp ngrok io 12345 gt localhost 22 如果我在后台运行 ngrok tcp 我找不到任何方
  • 如何从 PHP 调用 dup2() 系统调用?

    有一个eio dup2 http php net manual en function eio dup2 php函数来自Eio PECL 扩展 http php net manual en intro eio php但我对所有异步和事件循环
  • WinForms 表单冻结

    在表单 F1 上我有一个按钮 如果我创建另一个表单 我们称之为F2 并显示它没有问题 但我想做这样的事情 我的应用程序中的某些线程正在运行连接并侦听来自服务器的消息 当消息到达时 我的主窗体被注册以获取运行函数的事件 从该函数中 我尝试创建
  • 如何列出命名空间的功能?

    我想知道如何列出 Clojure 命名空间的所有函数 我已经做了一些研究 但还没有做到这一点 我已经了解了如何使用 show 方法列出 Java 类的方法 show java awt Graphics 为了列出 Clojure 命名空间的功
  • Python:concurrent.futures 如何使其可取消?

    Python concurrent futures 和 ProcessPoolExecutor 提供了一个简洁的接口来调度和监视任务 期货甚至provide https docs python org 3 library concurren
  • Angular 4 验证器可同时检查 2 个控件

    我有一个带有 2 个控件 port start 和 port end 的反应式表单 它们具有以下要求 两者都必须有一个值 它们的值必须介于 0 到 65535 之间 port start 值必须小于 port end 值 这是我到目前为止所