我知道有类似的问题已被提出,但我找不到一个好的答案 . 我想以Angular形式创建一个选择列表,其中每个选项的值是一个对象 . 另外,我不想使用2路数据绑定 . 例如如果我的Component有这些字段:
lUsers: any[] = [
{ Name: 'Billy Williams', Gender: 'male' },
{ Name: 'Sally Ride', Gender: 'female'}
];
curUser: any;
我希望我的HTML模板包含这个:
<select #selectElem (change)="setNewUser(selectElem.value)">
<option *ngFor="let user of lUsers" [ngValue]="user">
{{user.Name}}
</option>
</select>
但是,使用此代码,我的setNewUser()函数接收所选用户的Name字段的内容 . 为什么它选择那个特定的领域,我不知道 . 我期望它会收到所选选项的“值”,我专门设置为用户对象 .
请注意,我在选项中使用了ngValue而不是value . 这是通过SO的其他人的建议 . 如果我使用值代替,那么会发生的事情是对象被转换为字符串'[Object object]',这是setNewUser()接收的,这是无用的 .
仅供参考,我正在使用角度4.0.0和@ angular / cli 1.1.2在Windows 10上工作 . 这是setNewUser()方法:
setNewUser(user: User): void {
console.log(user);
this.curUser = user;
} // setNewUser()
我正在确定究竟是什么传递给它我的记录它,还包括在模板上: <pre>{{curUser}}</pre>
3 回答
我目前正在使用
[ngValue]
并且存储对象就好了 .有关使用
(change)
而不是(ngModelChange)
遇到问题的原因的解释可以在this question中找到所以,既然你已经使用了
[ngValue]
,你可能想要做这样的事情,你只能使用单向绑定才能使用ngModelChange指令:并且您的ts文件将捕获事件并接收User对象而无需通过id跟踪它,基本上重用您的旧方法将足够好:
由于
option
标签的value
属性无法存储整个对象,因此我们将在lUsers
数组中创建一个新属性id
以跟踪所选项目 .HTML:
这将在更改时将唯一的
id
传递给我们的setNewUser
函数 .在你的component.ts中:
这是上面代码的plnkr演示 . 打开开发人员工具以查看控制台日志 .
您可以在-Elements上使用[ngValue]而不是[value] . 这个对我有用 .
我在这里找到了这些信息:https://www.reddit.com/r/Angular2/comments/65run4/select_option_using_value_vs_ngvalue/