当不是所有的FromControls都有效时,Angular 2 FormGroup有效

时间:2017-03-20 23:53:49

标签: angular angular2-forms

正如我在标题中所写的那样,是否有可能拥有一个具有多个FormControls的表单组,并且该组在其并非所有控件都有效时才有效?

private moreInfoForm : FormGroup = this.formBuilder.group({
location: this.formBuilder.group({
  predefined : [''],
  custom : ['']
}),
demand_room : ['', [Validators.required]],
motivation : ['', Validators.required],
expectaions : ['', [Validators.required]],
participation : this.formBuilder.group({
  all : [''],
  wednesday : [''],
  thursday : [''],
  friday : [''],
  saturday : ['']
}),
donations : ['', Validators.required],
comments : ['', Validators.required]

});

https://plnkr.co/edit/v1v6UTrLypFqLpI1KNo7

对于位置组,我有一个预定义和自定义字段。 对于预定义,有一个和for custom有一个输入字段。 当用户选择“预定义”或“自定义”时,是否可以验证组。

另一个是参与。 这些是复选框,当用户选中其中一个chekcbox时,表单应该有效。

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用自定义验证程序检查predefinedcustom是否有值,此处我们将其称为validateGroup

location: this.formBuilder.group({
  predefined : [''],
  custom : ['']
},{
    validator: (formGroup: FormGroup) => {
      return this.validateGroup(formGroup);
    }
}),

相应的函数检查是否已填充,如果有效则返回null

private validateGroup(formGroup: FormGroup) {
  for (let key in formGroup.controls) {
    if (formGroup.controls.hasOwnProperty(key)) {
      let control: FormControl = <FormControl>formGroup.controls[key];
      if (control.value) {
        return null;
      }
    }
  }
  return {
    validateGroup: {
      valid: false
    }
  };
}

同样的功能validateGroup可以与你的日子一起使用,所以你的最终构建形式如下:

  private moreInfoForm : FormGroup = this.formBuilder.group({
    location: this.formBuilder.group({
      predefined : [''],
      custom : ['']
    },{
        validator: (formGroup: FormGroup) => {
          return this.validateGroup(formGroup);
        }
    }),
    demand_room : ['', [Validators.required]],
    motivation : ['', Validators.required],
    expectaions : ['', [Validators.required]],
    participation : this.formBuilder.group({
      all : [''],
      wednesday : [''],
      thursday : [''],
      friday : [''],
      saturday : ['']
    },{
        validator: (formGroup: FormGroup) => {
          return this.validateGroup(formGroup);
        }
    }),
    donations : ['', Validators.required],
    comments : ['', Validators.required]
  });

您可以阅读有关上述内容的更多信息,on this page

这是你的分叉

Plunker

PS。请注意我对单选按钮所做的更改,以便将其正确添加到表单中:

demand_rooms = ['Yes','No'];

<label *ngFor="let demand_room of demand_rooms">
  <input type="radio" name="demand_room" formControlName="demand_room" [value]="demand_room">Yes
</label>