我已经在SO和其他地方研究了许多类似的现有答案,但却找不到解决方案。
我在Angular 2中使用模型驱动的方法来构建我的表单,这是一个添加和编辑表单。在编辑模式下,使用从服务检索的数据填充值:这方面都很好,因为简单的文本输入都正确绑定。
其中一个属性是“国家/地区”,这是一个对象,如下所示:
export class Country {id: number; name: string;}
我想将它绑定到一个选择控件,该控件将包含可用的国家/地区列表,以及表单加载时填充的模型中的一个控件。我希望绑定的值是国家/地区对象,而不仅仅是id。
这是选择控件的html:
<select class="form-control" id="country" formControlName="country">
<option value="default">--Select a country--</option>
<option *ngFor="let c of countries" [value]="c">{{c.name}} </option>
</select>
这是我尝试从组件类填充值的地方:
(<FormControl>this.personForm.controls['country'])
.setValue(this.person.country, { onlySelf: true });
但是当页面加载时没有选择的选项,即使控制台确认this.person.country存在并填充了正确的对象。
我可以使用id来处理它:在视图中更改为[value] =“c.id”并在类中附加.id,然后选择正确的选项。问题是select不再为country属性发出一个对象,只是id。我尝试将[value]更改为[ngValue]并获得相同的结果。我甚至将[ngModel] =“country”添加到select元素中,但也没有帮助。
我会感激任何帮助。
答案 0 :(得分:8)
问题很可能是this.person.country
与country
数组中的countries
不同。
如果我们想要使它们相同,我们可以显式订阅select控件的valueChanges
或将[(ngModel)]
绑定到person.country
:
订阅更改
<强>码强>
this.countryForm.controls['country'].valueChanges.subscribe(country =>
this.person.country = country;
);
// initialize by finding the correct country object (this will overwrite the person's country object)
this.countryForm.controls['country'].setValue(countries.filter(c => c.id === person.country.id));
<强>模板强>
ngModel bind
我们仍然需要使对象匹配(比较Angular 2使用的策略,这正是JS使用的)
<强>码强>
this.person.country = this.countries.filter(c => c.id === this.person.country.id)[0];
<强>模板强>
<select class="form-control" id="country" formControlName="country" [(ngModel)]="person.country">
<option value="default">--Select a country--</option>
<option *ngFor="let c of countries" [ngValue]="c">{{c.name}}</option>
</select>
ngModel Plunker: http://plnkr.co/edit/UIS2V5rKh77n4JsjZtii?p=preview