【问题标题】:Angular form validation: compare two fields in different form groups角度表单验证:比较不同表单组中的两个字段
【发布时间】:2019-04-24 20:37:17
【问题描述】:

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

谁能解释或举例说明如何比较一个表单中不同表单组中的两个字段?

这里是代码 sn-p 看看我的表单和验证器的样子:

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;
    };
}

【问题讨论】:

  • 我猜你可以使用控件的根属性
  • @Florian 感谢您的回复。您能否提供一个示例,我应该在哪里绑定验证器?我应该通过什么?我应该返回什么(我认为这绝对不是AbstractControl)?
  • @hofshteyn,试试我的答案。

标签: angular typescript validation angular-forms reactive-forms


【解决方案1】:

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

所以你必须绑定到它。

您可以在FormGroup 上使用get 方法来获取group1field 的值:(<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>

这里有一个Sample StackBlitz 供您参考。

【讨论】:

  • 这是一个很好的答案。但是如果我们有一个动态创建的组呢?我的意思是,如果我们不知道会有多少组呢?例如,如果我将通过迭代某个数组来创建一个表单?我需要一个通用验证器来验证里面的所有字段
  • @hofshteyn,我认为您正在从这里的原始问题转向。请考虑提出一个包含所有相关细节的不同问题。或者您应该首先在 OP 中指定所有相关细节。我建议这样做,因为它不会在这个线程上产生任何额外的噪音。只是保持网站的清洁和准确。 :)
猜你喜欢
  • 2018-02-21
  • 2018-08-18
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多