【发布时间】:2019-08-12 20:49:54
【问题描述】:
我有一个反应式表单,其中包括一个父表单(国家/地区)和一个子表单数组(statesForm),其中的 select 元素具有基于对象的选项。我正在使用 [ngValue] 将选择元素的值设置为对象。使用选择列表的“(更改)”事件时,我无法从表单控件中检索所选值。
我已经从一个更复杂的页面中删减了这个示例。因此,我知道可能还有其他方法可以完成,但我有兴趣具体弄清楚为什么我不能让基于对象的选择选项与此设置一起使用。
这里是演示该问题的 stackblitz 的链接: https://stackblitz.com/edit/angular-jigxyl
这里是stackblitz代码的相关部分
ngOnInit(): void {
this.getCountry().subscribe(
country => {
this.country = country;
this.countryForm = this.buildFormGroup();
},
(error: any) => {
console.log(error);
}
);
}
CityCompare(c1: City, c2: City): boolean {
return c1 && c2 ? c1.name === c2.name : c1 === c2;
}
onSelectedStateChange(index: any): void {
var rowsFormArray = <FormArray>this.countryForm.controls["statesForm"];
var formGroup = <FormGroup>rowsFormArray.controls[index];
this.selectedCity = formGroup.controls["selectedCity"].value;
console.log(this.selectedCity);
}
private buildFormGroup(): FormGroup {
var formArray = new FormArray([]);
for (let i = 0; i < this.country.states.length; i++) {
var state = this.country.states[i];
var formGroup = new FormGroup({});
var formControl = new FormControl(state.selectedCity, [Validators.required]);
formGroup.addControl("selectedCity", formControl);
formArray.push(formGroup);
}
return new FormGroup({
statesForm: formArray
});
}
<form [formGroup]="countryForm">
<div>
<p>
I am using reactive forms and trying to use objects to set the options list
of a select element
<br/>
This form containts a form array as well.
<br/>
No matter which option I choose, the form control always evaluates to the first options<br/>
--------------------------------------
</p>
</div>
<div>
Country:{{country?.name}}
</div>
<div formArrayName="statesForm">
<div *ngFor="let state of country?.states; let $index = index">
<div>State: {{state.abbreviation}}</div>
<div [formGroupName]="$index">
<select
class="form-control input-sm"
formControlName="selectedCity"
[compareWith]="CityCompare"
(change)="onSelectedStateChange($index)"
>
<option *ngFor="let city of state?.cities" [ngValue]="state?.selectedCity">
{{ city?.name }}
</option>
</select>
</div>
</div>
</div>
Chosen object:{{this.selectedCity | json}}
</form>
【问题讨论】:
-
除了stackblitz之外,您还需要将实际代码放入问题中
标签: angular angular-reactive-forms