Alb*_*erd 2 javascript data-binding angularjs
我正在尝试使用 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"};Run Code Online (Sandbox Code Playgroud)
<select ng-options="value as value.Title for value in doesNotBind" ng-model="doesNotBindModel">
<option value> </option>
</select>Run Code Online (Sandbox Code Playgroud)
那永远不会绑定。但是如果我像这样绑定模型;有用!
$scope.doesNotBindModel = $scope.doesNotBind[1];Run Code Online (Sandbox Code Playgroud)
我是否错误地使用了语法还是这是预期的行为?
我创建了一个 POC 来充分展示我在说什么。
有趣的是,当没有 as 语法(没有对象数据绑定)时,它可以完美运行(在演示中也是如此)
谢谢!
编辑:我想这是预期的,因为它们是参考的,嗯?
ngModel按引用进行比较,而不是值。因此,如果您使用ng-options="value as value.Title for value in doesNotBind",那么您doesNotBindModel必须是:
JavaScript:
$scope.doesNotBindModel = $scope.doesNotBind[1];
Run Code Online (Sandbox Code Playgroud)
但是,如果您仍然想设置doesNotBindModelJSON 表示法,您可以像这样添加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>
Run Code Online (Sandbox Code Playgroud)
它也可以通过添加track by表达式来工作,但ngOptions 的Angular 文档不推荐这样做。
关于这背后的原因,请参考以下示例:
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>
Run Code Online (Sandbox Code Playgroud)
JavaScript:
$scope.values = [{
id: 1,
label: 'aLabel',
subItem: { name: 'aSubItem' }
}, {
id: 2,
label: 'bLabel',
subItem: { name: 'bSubItem' }
}];
$scope.selected = { name: 'aSubItem' };
Run Code Online (Sandbox Code Playgroud)
出于保留选择的目的,track by表达式始终应用于数据源的元素(item在本例中为 to )。为了计算一个元素是否被选中,我们执行以下操作:
track by数组中的元素。在示例中:[1, 2]track by中已选择的值ngModel。在示例中: 这是不可能的,如track by所指item.id,但从 中选择的值ngModel是{name: 'aSubItem'}。因此该track by表达式应用于错误的对象,无法找到所选元素。<select>始终重置为“未选择”选项。
现场示例:http : //plnkr.co/edit/Hu5T1Vo3qTkrDqe5PHJy
| 归档时间: |
|
| 查看次数: |
7479 次 |
| 最近记录: |