使用角度的反應性形式+嵌套FormGroups
:https://angular.io/guide/reactive-forms#nested-formgroups
一般,當頁面被加載的形式應具有3組(每1「形式」)。 申報形式:
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: '',
})
});
所以最後的提交按鈕,您只能使用父窗體獲得的驗證狀態(這將是false
如果從任何嵌套形式的組中的任何字段無效)。 HTML代碼:
<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 -->
代碼發送形式/發送1子窗體:
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});
}
每次需要顯示/隱藏新的子表格時, - 更新this.form
(你可能希望保存所有字段,但更新僅限於Validators
)。
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();
}
沒有得到你,請用代碼解釋。 –
已更新的答案... –