角度表单验证:比较不同表单组中的两个字段

2024-04-17

如果它与某人的问题重复,我很抱歉。我没有找到解决我的问题的方法。

任何人都可以解释或举例说明如何比较一种表单中不同表单组中的两个字段吗?

这是代码片段,可查看我的表单和验证器的外观:

private createForm() {

    const testGroups = {
        groupOne: this.fb.group({
            fieldOne: this.fb.control(null)
        }),
        groupsTwo: this.fb.group({
            fieldTwo: this.fb.control(null, [this.matchValidator])
        })
    };

    this.testForm = this.fb.group(testGroups);
}

 matchValidator(from: FormControl): ValidatorFn {
    return (to: AbstractControl): { [key: string]: any } => {
        return from.value && to.value && from.value === to.value
            ? { fieldMatch: true }
            : null;
    };
}

matchValidator将由 Angular 调用,而不是由您调用。所以它无法访问组件的this.

所以你必须绑定它。

您可以使用get上的方法FormGroup得到group1's field的值:(<FormGroup>this.mainForm.get('group1')).get('field').value

尝试一下:

组件类别:

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

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  mainForm: FormGroup;

  constructor(private fb: FormBuilder) { }

  ngOnInit() {
    this.mainForm = this.fb.group({
      group1: this.fb.group({
        field: []
      }),
      group2: this.fb.group({
        field: [null, [this.matchValidator.bind(this)]]
      })
    });

  }

  matchValidator(control: AbstractControl): { [key: string]: boolean } | null {
    const fromValue = control.value;
    if(this.mainForm) {
      const toValue = (<FormGroup>this.mainForm.get('group1')).get('field').value;
      if (fromValue && toValue && fromValue === toValue) {
        console.log('Control: ', control);
        return { 'fieldMatch' : true };
      }
      console.log('Control: ', control);
      return null;
    }
  }

  get group2Field() {
    return (<FormGroup>this.mainForm.get('group2')).get('field');
  }
}

模板:

<form [formGroup]="mainForm">
  <div formGroupName="group1">
    <label for="">Group 1 Field</label>
    <input type="text" formControlName="field">
  </div>
  <hr>
  <div formGroupName="group2">
    <label for="">Group 2 Field</label>
    <input type="text" formControlName="field">
    <p *ngIf="group2Field?.errors?.fieldMatch">These fields match</p>
  </div>
</form>

这是一个示例 StackBlitz https://stackblitz.com/edit/angular-compare-fields-in-different-groups?file=src%2Fapp%2Fapp.component.html供您参考。

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

角度表单验证:比较不同表单组中的两个字段 的相关文章

随机推荐

  • 后台根据时间激活本地通知

    因此 我有一个包含重复间隔本地通知的应用程序 我想添加一个在睡眠期间暂停通知的功能 到目前为止 我已经为用户创建了两个日期选择器 以指定他们想要停止重复间隔的时间以及自动重新启动的时间 我还为他们添加了一个 uiswitch 来激活睡眠模式
  • 在 PHP 中将 Oauth 2.0 访问令牌传递给 Fusion Tables API 时出现无效凭据错误

    我已经达到了沮丧的地步 正在寻求帮助 我整个周末都在学习新东西 以便尝试弄清楚如何使用需要通过 Oauth 2 0 进行身份验证的 goolge fusion table API 我开始使用 php 进行开发只是因为我能够找到一些帮助我走上
  • 将事件处理程序应用于动态控制

    我有一个用户窗体 可以动态放置commandButton到用户表单上 但我似乎无法正确设置动态事件处理程序 下面显示了我如何设置动态按钮的代码 Set cButton Me Controls Add Forms CommandButton
  • 使 fetch 调用真正同步

    是的 我想完全同步 我知道它会完全停止我唯一的线程 但我真的需要它 因为我使用一些我不想更改的 SDK 并且在这个 SDK 中 您需要传递一个将被调用且会更改的函数那里有一些价值 比如 function onNonce stuff cons
  • 如何使用 Sql Server 2008 删除表中的前 1000 行?

    我在 SQL Server 中有一个表 我想从中删除前 1000 行 但是 我尝试了此操作 但我不是只删除前 1000 行 而是删除了表中的所有行 这是代码 delete from mytab select top 1000 a1 a2 a
  • 如何在AWS EC2服务器中编写cron作业

    我在 AWS EC2 中创建了一个 cron 作业 但它不起作用 我按照以下步骤创建 crontab 第1步 我登录到AWS EC2实例 step 2 crontab e 第三步 插入模式 第4步 我输入了 php var www html
  • 处理多种表单和打印内容[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 您好 我对
  • 从 JBPM WorkItemHandler 抛出异常?

    我对从 JBPM 工作项处理程序抛出异常以及在业务流程中的其他地方处理异常的主题有点困惑 我们使用 JBPM 6 0 3 在 Jboss EAP 6 1 中运行 The JBPM 用户指南 http docs jboss org jbpm
  • ExtJS TreeGrid 中的复选框列

    有没有办法在新的 extjs 小部件 TreeGrid 中包含复选框列 将节点属性标记为 false true 并不像 TreePanel 那样有效 Cheers 我修改了 Ext ux tree TreeGridNodeUI 类来实现此功
  • 正则表达式捕获 VBA 注释

    我正在尝试捕获 VBA 注释 到目前为止我有以下内容 Z 它捕获以单引号开头但在字符串末尾之前不包含任何双引号的任何内容 即它不会匹配双引号字符串中的单引号 dim s as string a string variable works s
  • 未知层:当我尝试加载模型时 KerasLayer

    当我尝试将模型另存为 hdf5 时 path path h5 model save path 然后再次加载模型 my reloaded model tf keras models load model path 我收到以下错误 ValueE
  • 运行为黑莓设备创建的黑莓应用程序需要哪些步骤?

    我使用 java me 和 BlackBerry 特定 API 创建了一个 BlackBerry 应用程序 它在黑莓模拟器上运行良好 我想知道如何将此应用程序部署到 BlackBerry 设备 从文档中我发现 在设备上运行 BlackBer
  • XSLTProcessor::importStylesheet() 中的多个 PHP 警告

    Errors Warning XSLTProcessor importStylesheet xsltprocessor importstylesheet Undefined variable in transform php on line
  • 在 Cloud Dataflow 中进行 ETL 和解析 CSV 文件

    我是云数据流和 Java 的新手 所以我希望这是正确的问题 我有一个 csv 文件 其中有 n 个列和行 可以是字符串 整数或时间戳 我需要为每一列创建一个新的 PCollection 吗 我在示例中找到的大多数文档都类似于 PCollec
  • 如何在 Rails 6 或 Rails 7 alpha 引擎中使用 jqueryUI

    如果有人能够展示在 Rails 6 或 Rails 7 Alpha 2 引擎中使用 jquery ui 所需的确切步骤 我将不胜感激 我无法让 importmap rails 在 Rails 7 引擎中工作 也无法让 webpacker 在
  • 非静态字段、方法或属性需要对象引用

    这是我第一次使用列表 但我似乎做得不太好 我有一个客户类 其中包含客户列表作为客户类中的属性 可以这样做吗 public class Customer private List
  • Pandas:重新采样数据帧列,获取与最大值对应的离散特征

    样本数据 import pandas as pd import numpy as np import datetime data value 1 2 4 3 names joe bob joe bob start end datetime
  • 获取包中的所有子包

    PowerSet
  • 无法使用 Ruby 和 net/ssh 密钥进行连接

    我在使用 net ssh gem 通过 ssh 从 ruby 进行连接时遇到问题 得到 Net SSH AuthenticationFailed 代码如下 require net ssh keys path to private key N
  • 角度表单验证:比较不同表单组中的两个字段

    如果它与某人的问题重复 我很抱歉 我没有找到解决我的问题的方法 任何人都可以解释或举例说明如何比较一种表单中不同表单组中的两个字段吗 这是代码片段 可查看我的表单和验证器的外观 private createForm const testGr