我有以下mat-select
控件,其选项是从ngOnInit
上的服务器动态加载的:
<mat-form-field class="full-width">
<mat-select placeholder="Category" formControlName="patientCategory">
<mat-option>--</mat-option>
<mat-option *ngFor="let category of patientCategories" [value]="category">
{{category.name}} - {{category.description}}
</mat-option>
</mat-select>
<mat-error *ngIf="form.controls['patientCategory'].hasError('required')">
Please select a category
</mat-error>
</mat-form-field>
该控件是名为form
的表单组的一部分,我使用this.formBuilder.group({})
构建该表单。控件位于具有名为populateStep
的函数的组件内。
populateStep(value: PatientStepModel) {
// Set values of other controls..
// Categories have been retrieved
if (this.patientCategories.length > 0) {
// Must set reference for MatSelect
const toSelect = this.patientCategories.find(c => c.id == category.id);
this.form.get('patientCategory').setValue(toSelect);
} else {
this.logger.trace('No categories exist, will set category at the end of HTTP call..');
this.categoryToSelect = value.category;
}
}
如上面的代码所示,当外部组件调用populateStep
函数时,该函数会检查是否已从服务器加载类别。如果有类别,我可以设置选择的值。
但是,如果类别为空,即HTTP调用仍在进行中,我必须设置categoryToSelect
变量并在subscribe
回调中进行相同的选择。
private loadPatientCategories(): void {
this.operationCategoryService.getAll()
.subscribe(
results => {
this.patientCategories = results;
if (this.categoryToSelect) {
// Must set reference for MatSelect
const toSelect = this.patientCategories.find(c => c.id == category.id);
this.form.get('patientCategory').setValue(toSelect);
}
},
error => {
this.notificationService.openSnackBar('An error occurred');
}
);
}
我对这个解决方案不满意,因为它要求我在多个地方做同样的事情,有更好的解决方案吗?也许在设置类别之前设置超时?虽然我不能确定HTTP调用需要多长时间..