正如我在标题中所写的那样,是否有可能拥有一个具有多个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时,表单应该有效。
感谢。
答案 0 :(得分:2)
您可以使用自定义验证程序检查predefined
或custom
是否有值,此处我们将其称为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。
这是你的分叉
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>