使用值作为值语法时,AngularJS 选择不绑定

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 来充分展示我在说什么。

JSFiddle POC

有趣的是,当没有 as 语法(没有对象数据绑定)时,它可以完美运行(在演示中也是如此)

谢谢!

编辑:我想这是预期的,因为它们是参考的,嗯?

zhi*_*min 5

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.IDng-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 )。为了计算一个元素是否被选中,我们执行以下操作:

  1. 应用于track by数组中的元素。在示例中:[1, 2]
  2. 应用于track by中已选择的值ngModel

在示例中: 这是不可能的,如track by所指item.id,但从 中选择的值ngModel{name: 'aSubItem'}。因此该track by表达式应用于错误的对象,无法找到所选元素。<select>始终重置为“未选择”选项。

现场示例:http : //plnkr.co/edit/Hu5T1Vo3qTkrDqe5PHJy