Angular 1.3.3 ng-options问题,工作在1.3.0

时间:2014-11-21 20:33:24

标签: angularjs ng-options

使用AngularJS 1.3.0,这对我来说很有用:



var app = angular.module('myApp', []);

app.controller('MainCtrl', function($scope) {
  $scope.setting = {
    active: 1,
    array: [{
      name: 'Small',
      value: 'small'
    }, {
      name: 'Medium',
      value: 'medium'
    }, {
      name: 'Large',
      value: 'large'
    }]
  }
});

<!DOCTYPE html>
<html ng-app="myApp">

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.min.js"></script>
</head>

<body ng-controller="MainCtrl">
  <select ng-model="setting.active" ng-options="i as FS.name || FS.value for (i, FS) in setting.array"></select>
</body>

</html>
&#13;
&#13;
&#13;

在Angular 1.3.0上,我得到了返回的这三个选项,其中&#34;活跃&#34;一个选中。现在在1.3.3上,我得到了那个空的<option value="?">标签。

&#13;
&#13;
var app = angular.module('myApp', []);

app.controller('MainCtrl', function($scope) {
  $scope.setting = {
    active: 1,
    array: [{
      name: 'Small',
      value: 'small'
    }, {
      name: 'Medium',
      value: 'medium'
    }, {
      name: 'Large',
      value: 'large'
    }]
  }
});
&#13;
<!DOCTYPE html>
<html ng-app="myApp">

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.min.js"></script>
</head>

<body ng-controller="MainCtrl">
  <select ng-model="setting.active" ng-options="i as FS.name || FS.value for (i, FS) in setting.array"></select>
</body>

</html>
&#13;
&#13;
&#13;

有关如何更改ng-options以使其再次正常工作的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

因此,不完全确定导致此行为的Angular 1.3.0到1.3.3的修复程序是什么。也就是说,我注意到在浏览器中更改<select>的值现在返回一个字符串而不是一个整数(&#34; 0&#34;而不是0)。

active: 1更改为active: "1"解决了这个问题,但这并不理想。

答案 1 :(得分:1)

问题

请注意,即使您的源是数组,您也使用通常用于对象数据源的ngOptions参数的版本。因此,AngularJS假设它可以安全地将其视为一个对象,尤其是为了获得放在i变量中的键。确实是通过调用内部sortedKeys()函数来完成的,定义了here

function sortedKeys(obj) {
    return Object.keys(obj).sort();
}

这不是什么大问题,数组可以很容易地在对象中转换。但是如果数组的键是数字的,则对象的键是字符串。因此,i变量也是一个字符串!

以前这不是问题,因为与selectAs部分的比较并不严格,例如42 == '42'。但自AngularJS 1.3.2中的this change以来不再是的情况。

解决方案

除了修改你的对象以包含数字键并在selectAs部分中使用它之外,你还有两个简单的解决方案来解决这个问题。第一种是在模型中使用字符串as you've suggested

$scope.setting.active = '1';

另一个是强制selectAs部分为数字,例如乘以1:

<select ng-model="setting.active" ng-options="i*1 as FS.name || FS.value for (i, FS) in setting.array"></select>