Use angular's reactive forms + nested FormGroups: https://angular.io/guide/reactive-forms#nested-formgroups
In general, when page is loaded your form should have 3 groups (1 per "form").
Declare form as:
this.form = this.fb.group({
subForm1: this.fb.group({
subForm1_field1: ['', Validators.required ],
subForm1_field2: ['', Validators.required, Validators.min(5) ],
}),
subForm2: this.fb.group({
subForm2_field1: '',
subForm2_field2: ['', Validators.required, Validators.max(10) ],
}),
subForm3: this.fb.group({
subForm3_field1: '',
})
});
So finally for submit button you can use only parent form to get validation status (it will be false if any field from any nested form group is invalid). HTML code:
<input type="checkbox" (ngModel)="onShowSubForm3()"/><label>Show Form3</label>
<form [formGroup]="form">
<div class="form-horizontal"><!-- your inputs goes here for subForm1 --></div>
<div class="form-horizontal"><!-- your inputs goes here for subForm2 --></div>
<div class="form-horizontal" *ngIf="showSubForm3"><!-- your inputs goes here for subForm3 --></div>
</form>
<button type="button" (click)="submitSubForm1()" [disabled]="!form.get("subForm3").valid">Send 1</button> <!-- is disabled only if any field from `subForm3` is invalid -->
<button type="button" (click)="submitAllForms()" [disabled]="!form.valid">Send All</button> <!-- is disabled if any field is invalid -->
Code to send form/send 1 subForm:
submitAllForms(){
let formValue = this.form.value();
/*formValue = {
subForm1: {
subForm1_field1: "val1-1",
subForm1_field2: "val1-2",
},
subForm2: {
subForm2_field1: "val2-1",
subForm2_field2: "val2-2",
},
};*/
this.http.post("/url", {data: formValue});
}
submitSubForm1(){
let subForm1Value = this.form.get["subForm1"].value;
/*subForm1Value = {
subForm1_field1: "val1-1",
subForm1_field2: "val1-2",
};*/
this.http.post("/url", {data: subForm1Value});
}
Each time you need to show/hide new sub form - update this.form (you may want to store all fields but update Validators only).
showSubForm3: boolean = false;
onShowSubForm3(value){
this.showSubForm3 = value;
//THIS CODE CAN BE OPTIMIZED TO UPDATE ENTIRE `FormGroup` WITH NEW VALIDATORS
let field = this.form.controls["subForm3.subForm3_field1"];
if(value){
field.setValidators(Validators.compose([Validators.required]));
}else{
field.setValidators(Validators.compose([]));
}
field.updateValueAndValidity();
}