如果我在 ng-options 中使用 track by,则选择框值不会更新

The selectbox value is not updated if I use track by in ng-options

当我在 ng-options 中使用 track by 时,即使我选择了选择框中的值之一,Angular 也不会更新选择框的值。第二次尝试后,即使模型值已设置,它仍按预期工作。

var myapp = angular.module('myapp', []);
myapp.controller('FirstCtrl', function ($scope) {
    $scope.items = [
        ['ali', 'ali']
    ];
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
<div ng-app="myapp">
    <fieldset ng-controller="FirstCtrl">
        value: {{selected}} <br><br>
        <select 
            ng-options="item[0] as item[1] for item in items track by item[0]"
            ng-model="selected"></select>
  </fieldset>
</div>

Objective 的 track by 是用对象而不是数组元素来使用它。我建议你使用对象。这是一个例子

var myapp = angular.module('myapp', []);
myapp.controller('FirstCtrl', function ($scope) {
    $scope.items = [
        { id :1, value : 'ali'},
        { id :2, value : 'ahmed'}
    ];
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
<div ng-app="myapp">
    <fieldset ng-controller="FirstCtrl">
        value: {{selected}} <br><br>
        <select 
            ng-options="item as item.value for item in items track by item.id"
            ng-model="selected"></select>
  </fieldset>
</div>

它实际上在文档中有解释(https://docs.angularjs.org/api/ng/directive/ngOptions - 查找段落 "select as and track by")

您似乎不能将 track by 与某些 select as 表达式一起使用。

但是,如果您使用 ng-options="item as item[1] for item in items track by item[0]" 而不是 ng-options="item[0] as item[1] for item in items track by item[0]"

,它会起作用

https://jsfiddle.net/b9upojmb/1/

如评论track by 需要一个 objects 的数组,然后您可以通过任何对象属性进行跟踪

var myapp = angular.module('myapp', []);
myapp.controller('FirstCtrl', function ($scope) {
$scope.items = [
                    { name : "ali" },
                    { name : "ben" },
                    { name : "bill" }
               ]

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
<div ng-app="myapp">
    <fieldset ng-controller="FirstCtrl">
        value: {{selected}} <br><br>
        <select 
            ng-options="item as item.name for item in items track by item.name"
            ng-model="selected"></select>
  </fieldset>
</div>