如何设置Angular 2反应性选择的初始值

Kil*_*are 4 angular2-forms angular2-formbuilder angular

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

我正在使用Angular 2.2.0和Reactive Forms。

这是选择列表的值列表。

private categoryList: ICategory[] = [
    new Category({ id: 1, name: 'Cat 1' }),
    new Category({ id: 2, name: 'Cat 2' }),
    new Category({ id: 3, name: 'cat 3' })
];
Run Code Online (Sandbox Code Playgroud)

保存的值为:

{ id: 1, name: 'Cat 1' }
Run Code Online (Sandbox Code Playgroud)

使用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] 
    });
Run Code Online (Sandbox Code Playgroud)

然后用保存的数据初始化

  (<FormGroup>this.itemForm)
        .setValue({
          name: item.name,
          description: item.description,
          weight: item.weight,
          dimensions: item.dimensions,
          category: item.category 
        }, { onlySelf: true });
Run Code Online (Sandbox Code Playgroud)

模板看起来像这样

<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 }}
Run Code Online (Sandbox Code Playgroud)

预期结果 在选择中选择了第一项的名称,该名称与模板下显示的JSON中的文本匹配

实际行为 JSON显示如下:

 { "id": 1, "name": "Cat 1" }
Run Code Online (Sandbox Code Playgroud)

但是在选择中什么也没有选择

如果选择了--Select-,JSON将正确更新为“”。

如果选择了另一只猫,JSON也将正确更新。

我在做什么错,如何初始化选择?

编辑我也尝试过这个:

<option *ngFor="let cat of categories" [selected]="itemForm.controls['category'].value.id == cat.id" [ngValue]="cat">
Run Code Online (Sandbox Code Playgroud)

AJT*_*T82 5

如果我对您的理解正确,那么您想设置一个默认值。然后,您可以只引用item.category您要设置的值的索引。

我将这样设置值,我们将第一项设置为默认值。

setValues() {
    this.itemForm
        .setValue({
            name: item.name,
            category: item.category[0].id
        })
}
Run Code Online (Sandbox Code Playgroud)

然后使用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>
Run Code Online (Sandbox Code Playgroud)

将[ngValue](或仅使用[value])设置为cat.name或cat.id取决于您要使用的内容,因此,如果使用ngValue,则不会绑定整个对象!

这是一个正在工作的柱塞。不知道在哪里设置这些值,在这一点上,我在setValues插棒中做了一个- 按钮,用来模仿以后是否设置这些值。

希望有帮助!