【问题标题】:md-select not binding with object.valuemd-select 不与 object.value 绑定
【发布时间】:2017-10-11 21:27:51
【问题描述】:

我正在尝试将 Angular 4 上的 Material Design Select 与对象的数字属性绑定。像这样:

<md-select placeholder="info" 
           formControlName="info"  
           [(ngModel)]="loggedUser.info" 
           (ngModelChange)="infoSelected()">
                 <md-option *ngFor="let info of infos"
                                    value="{{info.id}}">
                                    <span>{{info.name}}</span>
                 </md-option>
</md-select>

编辑: Info 对象有两个属性:

id:number
name:string

loggedUser 有一个名为 info 的 number 类型的属性

问题是select没有绑定初始值

我做错了什么?

【问题讨论】:

  • 如果你尝试[value]="info.id",你会得到同样的结果吗?
  • 是的,它还在占位符上
  • 请发布loggedUser.infoinfos的详细信息。
  • 我已经用更多细节更新了原始消息。谢谢

标签: angular data-binding angular-material md-select


【解决方案1】:

使用双向绑定和模型驱动的表单不是预期的方式,因为可以考虑使用表单控制来替换 ngModel。但它可以做到,但是使用 ngModel 几乎是不必要的,因为尽管如此,你需要在你的 formcontrol 中引用你的loggedUser。从底部的 plunker 可以看出,表单创建的对象具有精确的值并构建为 loggedUser,因此表单对象将等于表单中的对象。根据您构建表单的方式,表单的对象可以在提交时简单地分配给loggedUser。同样作为评论,框中的香蕉,即[(ngModel)]等于以下

[ngModel]="someVariable" (ngModelChange)="someMethod($event)"

所以现在你正在使用“盒子里的香蕉”和ngModelChange,所以我建议你使用它,或者然后使用单向绑定和ngModelChange

但是回到你的代码和做参考,你可以在构建表单时做:

this.myForm = this.fb.group({
  // find the object in the infos array that matched the value of loggeduser
  info: [this.infos.find(x => x.id == this.loggedUser.info).id]
})

如果 loggedUser 的值检索是异步的,您需要等待构建表单直到可以设置值,或者您最初构建一个空表单并在检索到值后修补它们。

希望这会有所帮助,这里有一个 Plunker 可以玩。

【讨论】:

  • 您好,感谢您的评论。如果使用 ngModel 和 ngModelChange 是因为第二个选择的选项数组取决于第一个的值。 LoggedUser 的值是同步和中间的,但选择的选项(信息)的值是异步的。我最初在constructor() 上构建表单,并在ngOnInit() 方法中初始化loggeduser 的值,然后初始化infos 数组的值。所有其他输入值均已正确初始化。我认为问题在于如何将所选选项与对象属性进行比较
  • 我不确定你的意思,但上面显示了如何将对象与表单控件绑定?这不是你的意思吗?如果没有,请你分叉 plunker 并将你的代码放在那里,这说明了问题,否则我只能“猜测”你的代码是什么样子。
  • 只需将材料设计库更新到 beta 5,现在一切正常...... o_0
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多