如何设置 Angular 2 Reactive Select 的初始值
How to Set Initial Value of Angular 2 Reactive Select
我有一个 select 列表,我想将其初始化为从服务器返回的保存值。但是无论我尝试什么,我都无法让它使用 selected 值。
我正在使用 Angular 2.2.0 和 Reactive Forms.
这是 select 列表的值列表。
private categoryList: ICategory[] = [
new Category({ id: 1, name: 'Cat 1' }),
new Category({ id: 2, name: 'Cat 2' }),
new Category({ id: 3, name: 'cat 3' })
];
保存的值为:
{ id: 1, name: 'Cat 1' }
我使用 FormBuilder 创建表单
this.itemForm = this.fb.group({
name: [null, Validators.required],
description: [null, Validators.required],
weight: [null, Validators.required],
dimensions: [null, Validators.required],
category: [null, Validators.required]
});
然后我用保存的数据初始化它
(<FormGroup>this.itemForm)
.setValue({
name: item.name,
description: item.description,
weight: item.weight,
dimensions: item.dimensions,
category: item.category
}, { onlySelf: true });
模板看起来像这样
<select name="category" [formControl]="itemForm.controls['category']">
<option [selected]="itemForm.controls['category'].value == null" value="">-- Select --</option>
<option *ngFor="let cat of categories" [ngValue]="cat">
{{cat.name}}
</option>
</select>
{{itemForm.controls['category'].value | json }}
预期结果
第一项的名称在 select 中被 select 编辑,并与模板
下显示的 JSON 中的文本相匹配
实际行为
JSON 显示:
{ "id": 1, "name": "Cat 1" }
但是 select 在 select
中没有任何内容
如果选择 --Select-- JSON 正确更新为 "".
如果选择了另一只猫,JSON 也会正确更新。
What am I doing wrong, how do initialise the select?
编辑
我也试过这个:
<option *ngFor="let cat of categories" [selected]="itemForm.controls['category'].value.id == cat.id" [ngValue]="cat">
尝试使用 [attr.selected] 和 [attr.value] 而不是 [selected] 和 [ngValue]。
如果我没理解错的话,你想设置一个默认值。然后你可以只参考你的 item.category
+ 你想要设置的值的索引。
我会像这样设置值,我们将第一项设置为默认值。
setValues() {
this.itemForm
.setValue({
name: item.name,
category: item.category[0].id
})
}
然后在表格中使用formGroup
和formControlName
,所以:
<form [formGroup]="itemForm">
<input formControlName="name"/>
<small *ngIf="!itemForm.controls.name.valid">Name is required!</small>
<!-- More code -->
<select formControlName="category">
<! -- set ngValue to cat.id --> instead of just cat!
<option *ngFor="let cat of categories" [ngValue]="cat.id">
{{cat.name}}
</option>
</select>
</form>
根据您要使用的内容,将 [ngValue]
(或仅使用 [value]
)设置为 cat.name
或 cat.id
,因此如果您使用 ngValue
,没有绑定整个对象!
这是一个有效的Plunker。不知道你在哪里设置值,此时,我在 plunker 中制作了一个 setValues
按钮,它模仿了稍后设置值的情况。
希望对您有所帮助!
试试这个代码。它正在工作 Angular 5
<select formControlName="category">
<option [ngValue]="undefined" selected disabled>Select Type</option>
<option *ngFor="let cat of categories" [ngValue]="cat.id">
{{cat.name}}
</option>
</select>
我有一个 select 列表,我想将其初始化为从服务器返回的保存值。但是无论我尝试什么,我都无法让它使用 selected 值。
我正在使用 Angular 2.2.0 和 Reactive Forms.
这是 select 列表的值列表。
private categoryList: ICategory[] = [
new Category({ id: 1, name: 'Cat 1' }),
new Category({ id: 2, name: 'Cat 2' }),
new Category({ id: 3, name: 'cat 3' })
];
保存的值为:
{ id: 1, name: 'Cat 1' }
我使用 FormBuilder 创建表单
this.itemForm = this.fb.group({
name: [null, Validators.required],
description: [null, Validators.required],
weight: [null, Validators.required],
dimensions: [null, Validators.required],
category: [null, Validators.required]
});
然后我用保存的数据初始化它
(<FormGroup>this.itemForm)
.setValue({
name: item.name,
description: item.description,
weight: item.weight,
dimensions: item.dimensions,
category: item.category
}, { onlySelf: true });
模板看起来像这样
<select name="category" [formControl]="itemForm.controls['category']">
<option [selected]="itemForm.controls['category'].value == null" value="">-- Select --</option>
<option *ngFor="let cat of categories" [ngValue]="cat">
{{cat.name}}
</option>
</select>
{{itemForm.controls['category'].value | json }}
预期结果 第一项的名称在 select 中被 select 编辑,并与模板
下显示的 JSON 中的文本相匹配实际行为 JSON 显示:
{ "id": 1, "name": "Cat 1" }
但是 select 在 select
中没有任何内容如果选择 --Select-- JSON 正确更新为 "".
如果选择了另一只猫,JSON 也会正确更新。
What am I doing wrong, how do initialise the select?
编辑 我也试过这个:
<option *ngFor="let cat of categories" [selected]="itemForm.controls['category'].value.id == cat.id" [ngValue]="cat">
尝试使用 [attr.selected] 和 [attr.value] 而不是 [selected] 和 [ngValue]。
如果我没理解错的话,你想设置一个默认值。然后你可以只参考你的 item.category
+ 你想要设置的值的索引。
我会像这样设置值,我们将第一项设置为默认值。
setValues() {
this.itemForm
.setValue({
name: item.name,
category: item.category[0].id
})
}
然后在表格中使用formGroup
和formControlName
,所以:
<form [formGroup]="itemForm">
<input formControlName="name"/>
<small *ngIf="!itemForm.controls.name.valid">Name is required!</small>
<!-- More code -->
<select formControlName="category">
<! -- set ngValue to cat.id --> instead of just cat!
<option *ngFor="let cat of categories" [ngValue]="cat.id">
{{cat.name}}
</option>
</select>
</form>
根据您要使用的内容,将 [ngValue]
(或仅使用 [value]
)设置为 cat.name
或 cat.id
,因此如果您使用 ngValue
,没有绑定整个对象!
这是一个有效的Plunker。不知道你在哪里设置值,此时,我在 plunker 中制作了一个 setValues
按钮,它模仿了稍后设置值的情况。
希望对您有所帮助!
试试这个代码。它正在工作 Angular 5
<select formControlName="category">
<option [ngValue]="undefined" selected disabled>Select Type</option>
<option *ngFor="let cat of categories" [ngValue]="cat.id">
{{cat.name}}
</option>
</select>