【问题标题】:2 Custom validator not working in reactive forms in Angular2 自定义验证器在 Angular 中不能以反应形式工作
【发布时间】:2019-02-22 14:44:21
【问题描述】:

我需要弄清楚如何在我的响应式表单中添加第二个验证器。我已将“AvailabilityBalanceValidator”添加到初始化行的 patchValues() 中。但是只有第一个验证器在工作,为什么第二个验证器是 AvailabilityBalanceValidator() 不工作。请查看此链接CHECK THIS LINK

patchValues() {
    const materialForms = this.orders
      .reduce((acc, i) => [...acc, ...i.materials], [])
      .map(x => {
        return (this.fb.group({
          checkbox_value: [null],
          material_id: [{ value: x.id, disabled: true }],
          material_name: x.name,
          available_qty: 10,
          quantity: [null]
        }, [this.subFormValidator.bind(this), { validator: this.AvailabilityBalanceValidator('available_qty', 'quantity') }]));
      });

    this.myForm.setControl('rows', this.fb.array(materialForms));
    this.myForm.setValidators([this.formValidator.bind(this)])
  }

  AvailabilityBalanceValidator(campo1: string, campo2: string) {
    return (group: FormGroup): { [key: string]: any } => {
      const balance = group.controls[campo1];
      const quantity = group.controls[campo2];
      if (balance.value < quantity.value) {
        return {
          out: true
        };
      }
    };
  }

【问题讨论】:

    标签: angular angular6 angular-reactive-forms angular-forms angular4-forms


    【解决方案1】:

    我知道为什么您的第二个验证器不起作用。事实上,添加验证器是错误的。

    您将验证器数组指定为 this.fb.group() 方法的第二个参数:

    this.fb.group({...}, [this.subFormValidator.bind(this), { validator: this.AvailabilityBalanceValidator('available_qty', 'quantity') }];
    

    方法FormBuilder.group 接收具有两个可能参数validatorasyncValidator 的对象作为第二个参数(参见docs)。

    要修复您丢失的验证,您应该更改您的代码,如下所示:

    this.fb.group({...}, {
        validator: Validators.compose([this.subFormValidator.bind(this), this.AvailabilityBalanceValidator('available_qty', 'quantity')])
    };
    

    更新:

    subFormValidator(control: AbstractControl): { [key: string]: any } {
        return control.value.checkbox_value && 
            // Only adds the error if quantity is not set or it's an empty string
            (!control.value.quantity || control.value.quantity.length === 0)? { 'req': 'This field is required' } : null
    }
    

    在你的 html 中:

    <small class="form-text text-muted danger" *ngIf="row.hasError('req')">This field is required</small>
    

    因为否则,如果控件有错误,则始终显示消息。

    【讨论】:

    • 兄弟。这个必填字段仍然出现。请检查此stackblitz.com/edit/…
    • 因为您的验证器说如果control.value.checkbox_value 为真,请将错误req 添加到控件中。
    • 你能帮我解决这个问题吗,因为当我只添加一个验证器时它可以工作?谢谢兄弟
    • 兄弟,非常感谢。我很高兴感谢它
    • 嗨,你能帮我解决这个问题吗?谢谢。 stackoverflow.com/questions/69143223/…
    猜你喜欢
    • 2019-11-17
    • 2021-01-12
    • 1970-01-01
    • 2019-01-13
    • 2018-03-08
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多