假设我有以下用户:
$scope.users = {
"2": {
email: 'john@gmail.com',
name: 'John'
},
"3": {
email: 'elisa@gmail.com',
name: 'Elisa'
}
}
我想使用以下选项创建<select>
:
<option value="3">Elisa</option>
<option value="2">John</option>
换句话说,用户应按名称排序。
我使用(key, value) in expression
语法尝试了以下操作,但它不起作用:
<option ng-repeat="(user_id, user) in users | orderBy:'user.name'"
value="{{ user.id }}">
{{ user.name }}
</option>
我错过了什么?
我使用与ng-options
不兼容的ui-select2
时,请不要建议使用ng-options
的解决方案。
答案 0 :(得分:54)
虽然你会在一个链接中引用作者的答案引用的帖子中看到这个,但我认为最好在SO上提出一个上述的变通办法:
确实,这在技术上尚未实现,但如果您愿意稍微更改数据模型,则可以轻松解决:使用自定义过滤器生成对象属性的数组(不带< / strong>替换)。如果您将键字段添加到对象(上例中的“id”),您应该能够获得您要查找的行为:
app.filter("toArray", function(){
return function(obj) {
var result = [];
angular.forEach(obj, function(val, key) {
result.push(val);
});
return result;
};
});
...
$scope.users = {
1: {name: "John", email: "john@gmail.com", id: 1},
2: {name: "Elisa", email: "elisa@gmail.com", id: 2}
};
这是可以使用的ng-repeat指令:
<option value="{{user.id}}" ng-repeat="user in users | toArray | orderBy:'name'">{{user.name}}</option>
这是plunkr。
请注意,orderBy
过滤器将name
作为参数,而不是user.name
。
不幸的是,将id
属性添加到对象中确实可能会导致与包含对象中的键不匹配。
在你在答案中提到的链接中,还提出了一些解决方案,可以动态地在用户对象中创建id
属性,但我觉得这种方法不那么混乱(代价是引入数据复制)。
答案 1 :(得分:9)
好的,我找到了答案:
答案 2 :(得分:0)
添加到已接受的答案并查看数据格式,您应该将数据转换为
app.filter('myFilterUsers',function(){
return function(data)
{
var newRes = [];
angular.forEach(data,function(val,key){
val["id"] = key; //Add the ID in the JSON object as you need this as well.
newRes.push(val);
});
return newRes;
}
});