2016-10-20 87 views
2

即时通讯尝试编辑用户。该用户具有非原始的机器阵列。在编辑我想创建一个选择选项的新元素,并设置选择选项从用户对象价值:Angular 2动态创建选择并设置选择的选项(编辑操作)

export class User{ 
    constructor(
     private id: number, 
     private name: string, 
     private machines: Machine[] 
    ){} 
} 

export class Machine{ 
    constructor(
     private id: number, 
     private name: string, 
     private price: string 
    ){} 
} 

了JSON:

users =[ 
     { 
      "id":1, 
      "name":"Mike", 
      "machines":[ 
       { 
        "id":1, 
        "name":"bike", 
        "price":"10" 
       }, 
       { 
        "id":2, 
        "name":"boat", 
        "price":"100" 
       } 
      ] 
     } 
    ] 
machines =[ 
     { 
      "id":1, 
      "name":"bike", 
      "price":"10" 
     }, 
     { 
      "id":2, 
      "name":"boat", 
      "price":"100" 
     }, 
     { 
      "id":3, 
      "name":"car", 
      "price":"50" 
     } 
    ] 

在编辑我要选择的值设置为相应的来自用户的机器对象。

<div *ngFor="let machine of user.machines; let i = index"> 
    <label>Pick machine</label> 
    <div> 
     <select name="machine" [(ngModel)]="user.machines[i]"> 
      <option *ngFor='let mach of machines' [ngValue]='mach' >{{mach.name}}</option> 
     </select> 
    </div> 
</div> 

问题是这样的:

enter image description here

两个选择选项的设置好的最后一个。

UPDATE(溶液):

忘记提到,该div是内部Template-Driven form

<form #f="ngForm" *ngIf="user" (submit)="updateUser(f.valid)" novalidate> 
    <div *ngFor="let machine of user.machines; let i = index"> 
     <label>Pick machine</label> 
     <div> 
      <select name="machine" [(ngModel)]="user.machines[i]"> 
       <option *ngFor='let mach of machines' [ngValue]='mach' >{{mach.name}}</option> 
      </select> 
     </div> 
    </div> 
</form> 

如果在表单中实际提交了元素的名称。

每个输入元素都有一个角度所需的名称属性 表单向表单注册控件。

加入了独特的名字我解决我的问题:

<select name="machine_{{i}}" [(ngModel)]="user.machines[i]"> 
       <option *ngFor='let mach of machines' [ngValue]='mach' >{{mach.name}}</option> 
+0

问题是,当用'ngModel结合'和'ngValue'它期望相同的对象引用。 'user.machine [0]'和'machines [0]'具有相同的结构和内容,但不指向内存中的同一个对象,因此它不起作用。 – rinukkusu

+0

他们指向相同的.ts我设置this.user.machines [i] = this.machines [j],否则它不应该显示任何东西 –

+0

很棒,*属性“名称”需要是唯一的*。谢谢你 – elporfirio

回答

-1

你应该设置的数组的特定索引的ngModel值:

<div *ngFor="let machine of user.machines; let i = index"> 
     <label>Pick machine</label> 
     <div> 
      <select name="machine" [(ngModel)]="machine.id"> 
       //or you can set the 'id' direct 
       <option *ngFor='let mach of machines' [ngValue]='mach' >{{mach.name}}</option> 
      </select> 
     </div> 
    </div> 
+0

机器是一个对象数组的对象...是啊,我把它设置在这个user.machines [i] –

+0

阵列的特定索引然后你应该使用它:'[(ngModel)] =“machine.id “' – Poonam

+0

我不能这样做,当我有一个对象绑定,而不是id(原始类型)绑定 –