Angular 在 ng-options 的值之前注入 "string:"

Angular injects "string:" before value in ng-options

我有一个用 HTML select 元素定义的 ng-options 列表,例如:

<select
    required="required"
    ng-model="vm.selectedOption"
    ng-options="item.name as item.label for item in vm.options">

    <option value="">Select an option</option>
</select>

然而,这会导致以下结果 HTML:

<option value="string:VALUE" label="Option Name">Option Name</option>

我正在使用 Angular 版本 1.4.8,有没有人知道如何解决 string: 问题,或者至少可以向我解释为什么会发生这种情况?

vm.options 数组如下所示:

[
  {
    "name": "INFILL_AUTOMATIC",
    "label": "Automatic"
  },
  {
    "name": "INFILL_GRID",
    "label": "Grid"
  }
]

//编辑:

记录时 vm.selectedOption 我只看到正确的值。所以 ng-model 实际上具有正确的值。但是为什么Angular给了默认的value然后这个前缀,是不是用这个前缀给ng-model定义了"type"什么的?

这是工作Plunker

和 JS:

    <select ng-model="template"    ng-options="c as (c.label + ' - ' + c.name) for c in options">

此行为记录在 angular 更新日志中,作为 Angular 1.4-beta.0 的重大更改。 https://github.com/angular/angular.js/blob/master/CHANGELOG.md#breaking-changes-17

基本上,为了在 ng-options 中保留重复检查,如果将原始值列表提供给 ng-options,则值的类型会添加到值的前面,以创建唯一的哈希要跟踪的键(这与 angular 的早期版本不同,后者将通过索引或集合中项目的键进行跟踪)。

实际上,这应该不会影响 ng-options 的大多数用法。如果保留下拉菜单的 value 参数对您很重要,您可以在 ng-options 中使用 track by 参数以提供用于重复跟踪的备用键。

请注意,这与 ng-repeat 不同,因为 ng-repeat 无法使用此方法生成代理键,因为它会影响重复元素的行为。因此,如果在没有 track by 子句的情况下将重复的列表传递给 ng-repeatng-repeat 将产生错误并且不会呈现项目,其中 ng-options 能够呈现列表。