【问题标题】:Angular 2 dynamic create select and set selected option (edit operation)Angular 2 动态创建选择并设置选定选项(编辑操作)
【发布时间】:2017-03-02 03:57:27
【问题描述】:

我正在尝试编辑用户。该用户拥有非原始机器阵列。在编辑时,我想使用选择选项创建新元素并将该选择选项设置为来自用户对象的值:

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>

问题出在:

两个选择选项都设置为最后一个。

更新(解决方案):

忘了说,那个 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>

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

每个输入元素都有一个 Angular 所需的 name 属性 向表单注册控件的表单。

通过添加唯一名称我解决了我的问题:

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

【问题讨论】:

  • 问题是,当与ngModel 和ngValue 绑定时,它需要相同的对象引用。 user.machine[0] 和 machines[0] 结构和内容相同,但在内存中指向的不是同一个对象,因此不起作用。
  • 它们指向同一个,在.ts中我设置了this.user.machines[i] = this.machines[j],否则应该什么都不显示
  • 太棒了,属性“名称”必须是唯一的。谢谢

标签: angular


【解决方案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>

【讨论】:

  • 机器是对象数组中的一个对象...是的,我用这个 user.machines[i] 将它设置在数组的特定索引上
  • 那你应该使用它:[(ngModel)]="machine.id"
  • 当我有一个对象绑定,而不是 id(原始类型)绑定时,我不能这样做
猜你喜欢
  • 2018-09-13
  • 2014-11-18
  • 2018-01-11
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2011-06-03
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多