可以有许多不同的方法来做到这一点。我现在只分享两种方法,如果您觉得这些方法中的任何一种都不能满足您的用例,我们可以考虑另一种方法(前提是您提供更多关于您在此处尝试实现的目标的信息) .
方法一:
您的组件上有两个属性:
form$: Observable<FormGroup>;
list: Array<Element>;
一旦你有了 API 响应,而不是subscribe
ing 到它,你map
它并生成一个表单,同时还将响应的值分配给list
你声明的属性。像这样的东西:
this.form$ = this.service.getElements()
.pipe(
map((list: Array<Element>) => {
this.list = list;
return this.fb.group({
elementId: [list[0].id],
elementDescription: [list[0].description]
});
})
);
然后在模板中使用它,有点像这样:
<form
*ngIf="form$ | async as form"
[formGroup]="form">
<label for="">Element Id: </label>
<select formControlName="elementId">
<option
*ngFor="let element of list"
[value]="element.id">
{{ element.id }}
</option>
</select>
<br>
<label for="">Element description: </label>
<select formControlName="elementDescription">
<option
*ngFor="let element of list"
[value]="element.description">
{{ element.description }}
</option>
</select>
</form>
方法二:
您可能希望将列表和列表FormGroup
合并在一起。因此,您可以在组件中创建单个属性:
elementListWithForm$: Observable<{ list: Array<Element>, form: FormGroup }>;
然后你会分配一个像这样的值:
this.elementListWithForm$ = this.service.getElements()
.pipe(
map((list: Array<Element>) => ({
form: this.fb.group({
elementId: [list[0].id],
elementDescription: [list[0].description]
}),
list,
}))
);
然后你可以像这样在模板中使用它:
<form
*ngIf="(elementListWithForm$ | async) as formWithList"
[formGroup]="formWithList.form">
<label for="">Element Id: </label>
<select formControlName="elementId">
<option
*ngFor="let element of formWithList.list"
[value]="element.id">
{{ element.id }}
</option>
</select>
<br>
<label for="">Element description: </label>
<select formControlName="elementDescription">
<option
*ngFor="let element of formWithList.list"
[value]="element.description">
{{ element.description }}
</option>
</select>
</form>
这是StackBlitz 上的工作代码示例,供您参考。
PS:这种方法很大程度上受到了我在一篇文章中使用的方法的启发,那篇文章是关于在 Angular 中为 AngularInDepth 提高深度嵌套的响应式表单的性能。您可能也想检查一下。
希望这可以帮助。:)