我正在尝试使用AngularJS创建一个Select标记。我正在使用ngOptions和ngModel进行数据绑定。
现在:如果让我说我有一个如下数据源:
$scope.doesNotBind = [
{ID: 12, Title: "12 - Does not bind"},
{ID: 14, Title: "14 - Does not bind"},
];
$scope.doesNotBindModel = {ID: 14, Title: "14 - Does not bind"};
<select ng-options="value as value.Title for value in doesNotBind" ng-model="doesNotBindModel">
<option value> </option>
</select>
永远不会束缚。但是,如果我像这样绑定模型;有用!
$scope.doesNotBindModel = $scope.doesNotBind[1];
我使用的语法不正确还是这种预期的行为?
我已经创建了一个POC来充分展示我的意思。
有趣的是,当没有语法(没有对象数据绑定)时,它完美地工作(在演示中也是如此)
谢谢!
编辑:我猜这是预期的,因为它们是参考eh?
答案 0 :(得分:4)
ngModel
按引用进行比较,而不是值。因此,如果您使用ng-options="value as value.Title for value in doesNotBind"
,那么您的doesNotBindModel
必须是:
JavaScript的:
$scope.doesNotBindModel = $scope.doesNotBind[1];
但是,如果您仍想以JSON表示法设置doesNotBindModel
,可以将track by value.ID
添加到ng-options
表达式,如下所示:
HTML:
<select ng-options="value as value.Title for value in doesNotBind track by value.ID"
ng-model="doesNotBindModel">
</select>
它也可以通过添加track by
表达式来实现,但Angular的ngOptions文档不推荐使用它。
由于这背后的原因,请参考以下示例:
HTML:
<select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected">
<option value="">---- not selected ----</option>
</select>
JavaScript的:
$scope.values = [{
id: 1,
label: 'aLabel',
subItem: { name: 'aSubItem' }
}, {
id: 2,
label: 'bLabel',
subItem: { name: 'bSubItem' }
}];
$scope.selected = { name: 'aSubItem' };
为了保留选择,track by
表达式始终应用于数据源的元素(在此示例中为item
)。要计算是否选择了元素,我们执行以下操作:
track by
应用于数组中的元素。在示例中:[1, 2]
track by
应用于ngModel
中已选择的值。在示例中:这是不可能的,因为track by
引用了item.id
,但ngModel
中的选定值是{name: 'aSubItem'}
。因此track by
表达式应用于错误的对象,无法找到所选元素。 <select>
始终重置为“未选中”选项。
答案 1 :(得分:0)
它不具有约束力,因为两者都是两个不同的对象。
创建对象时,会为其分配单独的内存位置。
var a = {};
var b = {};
如果您检查是否a === b
,它将返回false。因为两者都是两个不同的对象。
这就是
的原因$scope.doesNotBindModel = {ID: 57, Title: "57 - Does not bind"};
不会绑定而
$scope.doesBindModel = $scope.doesBind[3];
因为在后面的情况下,您根据索引引用同一个对象。