如何设置 Angular 2 Reactive Select 的初始值

How to Set Initial Value of Angular 2 Reactive Select

我有一个 select 列表,我想将其初始化为从服务器返回的保存值。但是无论我尝试什么,我都无法让它使用 selected 值。

我正在使用 Angular 2.2.0Reactive 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
        })
}

然后在表格中使用formGroupformControlName,所以:

<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.namecat.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>