【问题标题】:How to make angularJS ng-model work with objects in select elements?如何使 angularJS ng-model 与选择元素中的对象一起使用?
【发布时间】:2013-07-29 10:42:21
【问题描述】:

option 元素传递对象时,我在select 元素上遇到了ng-model 问题。因此,假设我们有一个来自名为 columns 的表(表的定义)的列数组,我们想根据这个定义创建一些过滤器

var columns = [
  {name: 'Account ID',    type: 'numeric'},
  {name: 'Full name',     type: 'text'},
  {name: 'Date of birth', type: 'date'},
  {name: 'Active',        type: 'boolean'}
  // and so on
];

var filters = [{}];

HTML:

<div class="form-field" ng-repeat="filter in filters">
  <select ng-model="filter">
    <option value="" disabled>Choose filter</option>
    <option ng-repeat="column in columns" ng-value="column">{{column.name}}</option>
  </select>
  <input type="text" ng-model="filter.value">
</div>

如您所见,我希望 filter 获取 column 的值并在其中添加特定数据,所以在某个时刻,我的过滤器可能是这样的:

[
  {name: 'Account ID', type: 'numeric', value: 123},
  {name: 'Active', type: 'boolean', value: 'Yes'}
]

无论如何,我不确定这是否是这样做的方式,但我想知道如何实现这种行为,而无需在控制器中编写大量 js 代码。

我做了一些解决方法来使用ng-change 完成此操作,传递filtercolumn.name,在columns 数组中找到列,获取type 属性,更新filter,但我真的认为有一个更简单的答案。

【问题讨论】:

    标签: angularjs angularjs-ng-repeat


    【解决方案1】:

    您可以使用ng-options 将所选对象绑定到模型:

    <div class="form-field" ng-repeat="filter in filters">
       <select ng-options="column.name for column in columns" ng-model="filter.value">
             <option value="" disabled>Choose filter</option>
       </select>
    
       <input type="text" ng-model="filter.value.name">
    </div>
    

    Plunker

    更新答案:

    <div class="form-field" ng-repeat="filter in filters">
       <select ng-options="column.name for column in columns" ng-model="filters[$index]">
         <option value="" disabled>Choose filter</option>
       </select>
    
       <input type="text" ng-model="filters[$index].name">
    </div>
    

    【讨论】:

    • 我已将该 plunker 更新为使用 1.1.5,它仍然可以正常工作。
    • 嗯,奇怪...它适用于 plunker 但不适用于我的本地机器。无论如何......为什么绑定到filter.value而不是直接绑定到filter时它可以工作?不知何故,我需要与表定义相同的结构:)
    • 这是由于 javascript 在子范围上设置值时的行为方式。在评论中解释有点多,请参阅this question。要解决这个问题,您可以使用 ng-repeat 循环的 $index 属性来设置值。查看更新后的plunker
    • 太棒了!这就是我想要的......现在它可以工作了,非常感谢!我已经尝试过这样的事情,但由于我使用&lt;option ng-repeat="..."&gt; 并创建了一个新范围,因此很难实现这一点。现在,在&lt;select&gt;ng-model="filters[$index]" 上使用ng-options,就像我想要的那样工作。再次感谢!
    • 你能帮忙解决我遇到的类似问题吗stackoverflow.com/questions/63163118/…
    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 2023-03-18
    • 2016-07-29
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多