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

Bou*_*uke 3 javascript angularjs ng-options

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

<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>
Run Code Online (Sandbox Code Playgroud)

但是这会产生以下HTML:

<option value="string:VALUE" label="Option Name">Option Name</option>
Run Code Online (Sandbox Code Playgroud)

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

vm.options数组如下所示:

[
  {
    "name": "INFILL_AUTOMATIC",
    "label": "Automatic"
  },
  {
    "name": "INFILL_GRID",
    "label": "Grid"
  }
]
Run Code Online (Sandbox Code Playgroud)

//编辑:

记录时vm.selectedOption我只看到正确的值.所以ng-model事实上确实有正确的价值.但是为什么Angular给出了默认的value然后这个前缀,是否使用这个前缀来定义ng-model或者什么的"类型" ?

Cla*_*ies 7

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

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

在实践中,这不应该影响大多数用法ng-options.如果保留value下拉列表的参数很重要,则可以使用track by参数in ng-options来提供用于重复跟踪的备用密钥.

请注意,这不同于ng-repeat,在ng-repeat使用这种方法,因为它会影响到重复元素的行为不能产生一个代理键.因此,如果传递重复列表ng-repeat而没有track by子句,ng-repeat则会产生错误而不呈现项目,ng-options从而能够呈现列表.

  • 使用“track by”会导致下拉菜单丢失默认值自动选择。就像如果你 ng-model="modelId" 并且模型已经有一个值,它不是默认选择。你如何解决这个问题? (2认同)