解法一
概括和流程
定義了兩個組件,data-transfer-two和data-transfer-two-child,由data-transfer-two引用data-transfer-two-child,實現二者之間的數據傳輸
data-transfer-two通過input將數據傳入data-transfer-two-child
->data-transfer-two-child將數據存入form表單
->data-transfer-two定義data-transfer-two-child組件對象
->data-transfer-two通過組件對象獲取data-transfer-two-child內部的相關數據
關鍵代碼
data-transfer-two
<!--data是自定義的輸入輸出,輸入的是數據,同時給組件取名為dataTransferTwoChild-->
<app-data-transfer-two-child #dataTransferTwoChild [data]='data'></app-data-transfer-two-child>
// 根據前端的命名獲得組件
@ViewChild('dataTransferTwoChild') compDataTransferTwoChild: DataTransferTwoChildComponent; // 子組件
// 驗證子組件表單
for (const i in this.compDataTransferTwoChild.childValidateForm.controls){
if (this.compDataTransferTwoChild.childValidateForm.controls[i].errors != null) {
this.msg.error('請確認表單輸入');
return;
}
}
// 獲得子組件數據
let childData=Object.assign(this.data, this.compDataTransferTwoChild.childValidateForm.value);
示例代碼
解法二
概括和流程
定義了兩個組件,data-transfer和data-transfer-child,由data-transfer引用data-transfer-child,實現二者之間的數據傳輸
data-transfer通過input將數據傳入data-transfer-child
->data-transfer-child將數據存入form表單
->監控form表單數據變化,通過output調用方法通知data-transfer
->data-transfer拼湊兩個組件的數據,得到結果
關鍵代碼
data-transfer
<nz-tabset [(nzSelectedIndex)]="tabIndex">
<nz-tab nzTitle="Tab2">
<!--[]代表輸入,()代表輸出-->
<!--data和dataChange是自定義的輸入輸出,輸入的是數據,輸出的是方法-->
<app-data-transfer-child [data]='data' (dataChange)='getTime($event)'></app-data-transfer-child>
</nz-tab>
</nz-tabset>
/**
* @description 獲得輸出
*/
getTime=function(e){
// 返回表單和數據
// 這里的數據是在子組件里面emit的數據
this.data.time=e.data.time;
this.childValidateForm=e.childValidateForm;
}
data-transfer-child
<form nz-form [formGroup]="childValidateForm">
<nz-form-item>
<nz-form-label [nzSpan]="3" nzRequired>登記時間</nz-form-label>
<nz-form-control [nzSpan]="8" nzHasFeedback>
<!--使用ngModelChange隨時監聽數據變化-->
<nz-date-picker [nzFormat]="yyyy/MM/dd" id="_time" formControlName="time" (ngModelChange)="changeData()"></nz-date-picker>
</nz-form-control>
</nz-form-item>
</form>
// 輸入
@Input() data;
// 輸出
@Output() dataChange: EventEmitter<any> = new EventEmitter();
childValidateForm: FormGroup;
/**
* @description 監聽數據變化並返回給父組件
*/
changeData=function(){
// 因為子組件沒有類似於提交的按鈕,否則emit可以在點擊按鈕的時候調用,表單驗證也可以放在子組件內
this.data=Object.assign(this.data, this.childValidateForm.value);
this.dataChange.emit({data:this.data,form:this.childValidateForm});
}