当 ng 选项的值和标签等效时出现错误

Bug when value and label of ng-options are equivalent?

本文关键字:错误 标签 选项 ng      更新时间:2023-09-26

如果我从 $scope.$watch 语句中设置 ng 选项,我遇到了问题。

以下作品: <select ... ng-options="x.val as x.id for x in options"></select>

但这不会: <select ... ng-options="x.val as x.val for x in options"></select>

Plunker显示我的问题 - 单击"更新选项"

似乎如果在选项

之前设置了模型的值,并且标签和值是等效的,则模型将不匹配任何可用选项。

这是一个错误,还是我做错了什么?

示例控制器代码:

$scope.myModel = 'Two';
$scope.$watch('loadTrigger', function(newValue, oldValue) {
    if (newValue == oldValue) { return; }
    $scope.options = [{id: 1, text: 'One'}, {id: 2, text: 'Two'}...];
})

示例视图:

<select ng-model="myModel" ng-options="x.text as x.text for x in options">...</select>

当监视触发并更新选项时,选择将显示空白或默认选项,而不是预期的"二"。 但是,如果标签和值不同(甚至略有不同),则一切按预期工作

这是 Angular 如何将选择选项与绑定模型相关联的模糊(对我来说)领域之一。

简而言之,添加track by(并且不使用select as)可以解决此问题:

<select ng-model="textLabel" 
        ng-options="x.text for x in dynamicOptions track by x.text">
   <option value="">[No Value]</option>
</select>

编辑:前段时间我发现这个问题在Angular的github上讨论过,没有track by的方法在1.2.x Angular ->中工作,因此是模糊的部分