【问题标题】:Angular reactive form validate input based on two other inputAngular 响应式表单根据其他两个输入验证输入
【发布时间】:2020-02-12 19:49:21
【问题描述】:

我有三个输入字段,分别是

  1. 最低分数
  2. 最高分
  3. 原产地

所以,origin at 值必须介于最低分和最高分之间。

我的表单是这样的

this.fb.group({
    min: ['', [Validators.required]],
    max: ['', [Validators.required]],
    origin: ['', [Validators.required, Validators.min(?), Validators.max(?)]] # I need value of min and max input field value here
})

如何正确验证原始输入字段?

编辑:

注意 - fbFormBuilder

我的整个表格

this.scalesForm = this.fb.group({
  scales: this.fb.array([
    this.fb.group({
      type: ['x', [Validators.required]],
      name: ['', [Validators.required]],
      components: this.fb.array([], [Validators.required]),
      min: ['', [Validators.required]],
      max: ['', [Validators.required]],
      origin: ['', [Validators.required]]
    }),
    this.fb.group({
      type: ['y', [Validators.required]],
      name: ['', [Validators.required]],
      components: this.fb.array([], [Validators.required]),
      min: ['', [Validators.required]],
      max: ['', [Validators.required]],
      origin: ['', [Validators.required]]
    })
  ])
});

【问题讨论】:

标签: angular angular-material angular-reactive-forms


【解决方案1】:

我将使用自定义验证器,在您的情况下类似于:

export function ValidateOrigin(control: AbstractControl): {[key: string]: boolean} | null {
  if (control.value < this.scalesForm.controls.scales[0].controls.min.value && control.value > this.scalesForm.controls.scales[0].controls.max.value) {
    return { invalidOrigin: true };
  } else {
    return null;
  }
}

// in the form declaration
this.fb.group({
  min: ['', [Validators.required]],
  max: ['', [Validators.required]],
  origin: ['', [Validators.required, ValidateOrigin]]
})

【讨论】:

  • 应该是if (control.value &lt; this.fb.controls.min.value || control.value &gt; this.fb.controls.max.value) {,因为这是应该报告错误的条件。或者,您需要在 if 块中使用 return null。目前,它似乎以其他方式实施。
  • 感谢@axl-code 的回答!请查看更新后的帖子。但我的表单是一个包含两个表单组的表单数组。我怎么知道从哪个中选择最小值和最大值? (来自类型:x 或类型:y)
  • 我已经更新了我的答案,检查它是否适用于该结构。但基本上我会创建 2 个不同的验证函数(或两者的参数通用函数),一个用于 x,另一个用于 y,更改 scales 属性的索引
  • 您需要使自定义表单控制完整组,如果更改原点后的最小值会发生什么?
【解决方案2】:

您必须创建一个自定义验证器。首先,您需要将表单控件创建为局部变量,以使它们的实例可用于您的依赖控件,如下所示:

const minFormControl = this.fb.control('', [Validators.required]);
const maxFormControl = this.fb.control('', [Validators.required]);

然后你可以创建你的组并使用这样的自定义验证器添加所有控件:

this.fb.group({
    min: minFormControl,
    max: maxFormControl,
    origin: this.fb.control('', [Validators.required, CustomValidators.validateMin(minFormControl), CustomValidators.validateMax(maxFormControl)])
})

然后在那些你可以实现你的验证逻辑。

【讨论】:

  • 感谢@Blind Despair 的回答。我需要为此创建大量变量/控件,因为我在更新后的帖子中将这个组放在表单数组中。
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
相关资源
最近更新 更多