2

我有一个绑定到对象的 ng-options 选择。以编程方式设置 ng-model 仅在将其设置为字符串时才能正常工作(更新选择)。如果我将 ng-model 设置为整数,它就不起作用。我真的不想进行这种转换。这是唯一的方法吗?

http://jsfiddle.net/HMjnV/1/

<div ng-controller="MyCtrl">
    <select ng-options="id as name for (id, name) in items" ng-model="selected"></select>
    <div>Selected ID: {{selected}} </div>
    <button ng-click="setSelected(1)">Set Selected to ID 1 as Integer</button>
    <button ng-click="setSelected('1')">Set Selected to ID 1 as String</button>
    <div>Programmatically setting the ng-model as string sets the dropdown but not as integer.</div>
</div>

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

function MyCtrl($scope) {
    $scope.items = {1: 'a', 2: 'b', 3:'c'};
    $scope.selected = null;

    $scope.setSelected = function(id) {
        $scope.selected = id; 
    }
}
4

4 回答 4

4

已编辑

toString如果您正在寻找快速而肮脏的解决方案,您可以在以编程方式设置模型值时尝试使用。有关问题核心的详细信息,请参阅@ExpertSystems 答案。

$scope.setSelected = function(id) {
    $scope.selected = id.toString(); 
}
于 2014-05-09T05:08:45.203 回答
3

这很奇怪,但是您可以通过强制在理解表达式中进行强制转换来获得ng-options和之间的绑定:ng-model

ng-options="id*1 as name for (id, name) in items" 

这是你的小提琴的一个叉子,展示了这个技巧:http: //jsfiddle.net/wittwerj/HMjnV/9/

话虽如此,我更喜欢 Marc 在控制器中转换 toString 的方法。

于 2014-05-09T05:45:37.437 回答
2

是的,可以像您所做的那样预先填充值,那么它肯定应该是string. 由于option标签中的 value 属性只需要String. 但是在AngularJs中是的,您可以在fiddle中给出这样的参考。解决您的问题的方法是将 id 转换为字符串。

于 2014-05-09T05:26:00.610 回答
0

JS对象具有属性名称-值对。
value可以是任何类型,但name始终是字符串。
尽管您认为您将其定义为数字,但它会自动转换为字符串。您无法更改它(即创建一个具有数字属性名称的对象)。

于 2014-05-09T05:31:42.193 回答