Angular:在更改另一个表单控件时触发表单控件验证

标签 angular angular-reactive-forms angular-custom-validators

请在 stackblitz 中引用该项目
here .

可以看出,我的 react 形式与控件为 firstNumber , secondNumberthirdNumber .我需要验证表单控件 thirdNumber使得它的值不应该大于在firstNumber中具有最小值的表单控件的值。和 secondNumber .

自定义验证器 validateThirdNumber每当表单控件 thirdNumber 时,组件中的内容都可以正常工作改变,但我需要
对表单控件的更改进行验证 firstNumbersecondNumber也是因为验证逻辑可以随着表单控件的变化而变化firstNumbersecondNumber .

为此,我添加了一个关于更改表单控件的事件 firstNumbersecondNumber我在哪里标记表单控件 thirdNumbertouched但它的验证似乎没有被触发。

那么,如何触发表单控件的验证 thirdNumber关于表单控件的更改 firstNumbersecondNumber ?

还有,为什么是this.myFormGroup即使在绑定(bind) app.componen.ts 之后,在自定义验证器中有时也未定义(请参阅 line:22 中的日志 this)到其表单控件声明和 this.myFormGroupconstructor 中定义?

最佳答案

您的最佳选择是创建您自己的自定义全局验证器。

class ValidateThirdNumber {
    static validate(control: AbstractControl) {
          console.log(control);
        if(control) {
           const firstNumber = control.get('firstNumber').value;
           const secondNumber = control.get('secondNumber').value;
           const thirdnumber = control.get('thirdNumber').value;
        if (firstNumber > secondNumber) {
          if (thirdnumber > secondNumber) {
            control.get('thirdNumber').setErrors( {greaterThanSecondNumber: true} );   
          }
        } else if (firstNumber < secondNumber) {
          if (thirdnumber > firstNumber) {
              control.get('thirdNumber').setErrors( {greaterThanFirstNumber: true} ); 
          }
        }
        }
        return null;
        }
}

表单组的初始化应该是:
 this.myFormGroup = this.fb.group({
      firstNumber: [0],
      secondNumber: [0],
      thirdNumber: [0]
    }, {validator: [ValidateThirdNumber.validate] });

你不再需要touched属性了
<span *ngIf="myFormGroup.get('thirdNumber').errors?.greaterThanFirstNumber">
  Third number cannot be greater than First Number
 </span>
    <span *ngIf=" myFormGroup.get('thirdNumber').errors?.greaterThanSecondNumber">
  Third number cannot be greater than Second Number
 </span>

你也不需要 (change)事件删除它们

关于Angular:在更改另一个表单控件时触发表单控件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55741834/

相关文章:

带有 Validators.pattern 的正则表达式仅用于整数

angular - 当值在构造时更改时,表单卡在带有异步验证器的 PENDING 状态

javascript - 在函数内部动态设置时,setValidators 根本不起作用

javascript - 如何使用 Snap.svg 和 Angular 5 在悬停时缩放不同的 svg 图层

angular - 如何 forkJoin() void 函数?

angular - 如何在 Angular 5+ 中使用 ngx-file-drop 验证文件?

angular - 为什么表单错误的 getter 在我的 Angular Reactive Form 组件模板中不起作用,但直接引用却可以?

angular - 选项卡组件内的 formbuilder 在 Angular 6 中不起作用

Angular react 形式 : how to reset form state and keep values after submit

css - 将 Angular Material 的 textarea 设置为组件的 50%