【发布时间】:2013-10-17 08:46:08
【问题描述】:
首先让我说这个问题与使用 ng-options 在<select> 标记中进行选择的问题非常相似。例如,Working with select using AngularJS's ng-options。具体问题是比较一个对象的两个不同实例,它们的引用不相等,但在逻辑上表示相同的数据。
为了演示,假设我们在模型中有以下选项数组和选定的选项变量:
$scope.items = [
{ID: 1, Label: 'Foo', Extra: 17},
{ID: 2, Label: 'Bar', Extra: 18},
{ID: 3, Label: 'Baz', Extra: 19}
];
$scope.selectedItem = {ID: 1, Label: 'Foo'};
请注意,以上对象仅用于演示。我特意省略了selectedItem 上的“额外”属性,以表明有时我的模型对象的特定属性不同。重要的是我想比较 ID 属性。我的真实对象上有一个equals() 函数,用于比较原型“类”和 ID。
然后在视图中:
<label class="radio inline" ng-repeat="item in items">
<input type="radio" ng-model="selectedItem" ng-value="item"> {{item.Label}}
</label>
现在,这里的问题是“Foo”的单选按钮不会开始被选中,因为 Angular 正在使用对象的引用相等。如果我将范围中的最后一行更改为以下内容,一切都会按预期进行。
$scope.selectedItem = items[0];
但是,我遇到的问题是,在我的应用程序中,我并没有简单地在范围内声明这两个简单的变量。相反,选项列表和绑定所选选项的数据结构都是使用 $http 从服务器查询的较大 JSON 数据集的一部分。在一般情况下,我很难将数据绑定的选定属性更改为我的数据查询中的等效选项。
所以,我的问题:
在 <select> 的 ng-options 中,angular 提供了一个 track by 表达式,它允许我说类似“object.ID”的内容,并通知 angular 它应该通过 ID 属性将选定的模型值与选项进行比较。是否有类似的东西可以用于绑定到同一个模型属性的一堆无线电输入?理想情况下,我将能够告诉 Angular 使用我自己的自定义 equals() 方法,该方法已放置在这些模型对象上,该方法检查对象类型和 ID。如果做不到这一点,也可以指定 ID 比较。
【问题讨论】:
-
我们使用 underscore.js 中的 findWhere 方法解决了这个问题,方法是在开始时从选项中选择值。我也想知道是否可以这样做。
-
我没有使用 undescore.js,但我不介意滚动我自己的比较函数来做我需要的事情。您实际上在哪里雇用 findWhere?在自定义指令中?
-
是的,我们有单选按钮,下拉指令就是为了这个。
-
我很想知道您如何在解决方案中构建指令。这实际上可能是我的答案。
-
这是radio button directive。它有点复杂,因为即使您使用 AJAX 调用加载选项,它仍然有效。你可能想让它更简单。
标签: javascript angularjs