首先让我说这个问题与<select>
使用 ng-options 在标签中进行选择的问题非常相似。例如,使用 AngularJS 的 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 数据集的一部分。在一般情况下,我很难将数据绑定的选定属性更改为我的数据查询中的等效选项。
所以,我的问题是:在 ng-options 中<select>
,angular 提供了一个track by
表达式,允许我说类似“object.ID”的内容,并通知 angular 它应该通过 ID 属性将选定的模型值与选项进行比较。是否有类似的东西可以用于绑定到同一个模型属性的一堆无线电输入?理想情况下,我可以告诉 Angular 使用我自己的自定义 equals() 方法,该方法已放置在这些模型对象上,该方法检查对象类型和 ID。如果做不到这一点,也可以指定 ID 比较。