角反应形式自定义验证器。仅在选中复选框时启用验证

时间:2018-09-17 13:18:18

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

我在验证仅标记的复选框时遇到问题。首先,当组件初始化且所有复选框都被禁用时,如果他们单击保存按钮,则它应输出一个验证,表明您没有单击任何复选框。第二个验证是当您标记了一个复选框但没有输入任何数量时,它仅应标记为“此字段为必填”。现在,但是,当我单击保存按钮时,即使禁用了所有数量,也会出现错误“此字段是必需的”。我该如何解决?也请我评论的功能,也许这会有所帮助。谢谢。

请单击此处查看我的stackblitz链接:CODE LINK

patchValues() {
    let rows = this.myForm.get('rows') as FormArray;
    this.orders.forEach(material => {
      material.materials.forEach(x => {
        rows.push(this.fb.group({
          checkbox_value: [null],
          material_id: new FormControl({ value: x.id, disabled: true }, Validators.required),
          material_name: x.name,
          quantity: [null]
        }));
        // this.formArrayLength++;
      });
    });
  }

1 个答案:

答案 0 :(得分:1)

您需要为表单和数组中的子表单创建custom validators

对于该格式,当选中其中一个复选框时有效。看起来像

formValidator(control: AbstractControl): { [key: string]: any } {
   return control.value.rows.some(i => i.checkbox_value) ? null : { 'checkboxReq': 'Some checkbox field is required' }
}

将其添加到表单中

this.myForm.setValidators([this.formValidator.bind(this)])

您可以在模板中使用myForm.getError('checkboxReq')

<small class="form-text text-muted danger">{{myForm.getError('checkboxReq')}}</small>

对于子表单,需要另一个验证器

subFormValidator(control: AbstractControl): { [key: string]: any } {
   return control.value.checkbox_value ? { 'req': 'This field is required' } : null
}

在初始化子表单时添加它

(this.fb.group({
      checkbox_value: [null],
      material_id: [{ value: x.id, disabled: true }],
      material_name: x.name,
      quantity: [null]
    }, [this.subFormValidator.bind(this)]));

模板

<small class="form-text text-muted danger" *ngIf="row.invalid && row.touched">This field is required</small>

stackblitz example with changes