首先我不會遵守三個獨立的數字,而是創造一些包裝器它(讓我們暫時稱之爲wrapper
- 記住從休息電話你應該收到一個領域的對象)
export class Wrapper {
districtId: number;
municipalityId: number;
settlementId: number;
constructor(dist, mun, sett){
this.districtId = dist;
this.municipalityId = mun;
this.settlementId = sett;
}
}
那麼我們app.html看起來像:
District id: {{ wrapper.districtId }}
Minicipality id: {{ wrapper.municipalityId }}
Settlement id: {{ wrapper.settlementId }}
<my-child [wrapper]="wrapper"></my-child>
說明該領域的每一次變化都會自動在wrapper.districtId
等
可見,我們可以簡化我們的子組件: 當我們輸入我們不能將我們的邏輯基於OnChanges()(因爲它會被稱爲一旦對象變化引用了wrapper
,在我們的例子中只有字段被更新),但是我們可以調用select
上的特定函數變化:
<div>
<label for="district">District</label>
<select id="district" (change)="setMunicipalities()" [(ngModel)]="wrapper.districtId">
<option [value]="district.id" *ngFor="let district of districts">{{ district.name }}</option>
</select>
</div>
和最終邏輯。請注意,當我們調用setMunicipalities()我們並不需要檢查是否有任何改變,請注意,我們沒有額外的檢查有什麼改變(如前)
constructor(private changeDetector: ChangeDetectorRef) {
this.districts = DISTRICTS;
}
ngOnInit() {
this.setMunicipalities();
this.setSettlements();
}
private setMunicipalities() {
this.municipalities = MUNICIPALITIES.filter(mun => mun.districtId == this.wrapper.districtId);
this.setSettlements();
this.changeDetector.detectChanges();
}
private setSettlements(){
this.settlements = SETTLEMENTS.filter(sett => sett.municipalityId == this.wrapper.municipalityId);
}
我叉你plunker(https://plnkr.co/edit/A7aGJcZhQAryvVPLTrOA?p=preview) - 我有在plunker中注入ChangeDetectorRef的問題(所以不是所有的下拉列表都會自動更新,但希望你有這種感覺)
我不知道Reactive Forms的細節,但這是一個有趣的例子。 –