161

我通过使用连接到控制器的 ng-options 填充下拉列表,该控制器又调用服务。不幸的是,进来的数据是一团糟,我需要能够按字母顺序对其进行排序。

你认为类似的东西$.sortBy会做,但不幸的是它没有做杰克。我知道我可以使用辅助方法或类似方法通过 javascript 对其进行排序function asc(a,b),但我拒绝相信没有更清洁的方法可以做到这一点,而且我不想用辅助方法使控制器膨胀。原则上它是如此基本,所以我不明白为什么 AngularJS 没有这个。

有没有办法做类似的事情$orderBy('asc')

例子:

<select ng-option="items in item.$orderBy('asc')"></select>

拥有选项非常有用,orderBy这样您就可以在通常尝试对数据进行排序时做任何您想做的事情。

4

4 回答 4

344

Angular 有一个orderBy过滤器,可以像这样使用:

<select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name'"></select>

有关示例,请参见此小提琴。

值得注意的是,如果track by正在使用它需要出现在orderBy过滤器之后,如下所示:

<select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name' track by f.id"></select>
于 2012-09-07T03:02:13.037 回答
26

您应该能够使用过滤器:orderBy

orderBy可以接受reverse标志的第三个选项。

<select ng-option="item.name for item in items | orderBy:'name':true"></select>

这里项目按“名称”属性以相反的顺序排序。第二个参数可以是任何顺序函数,因此您可以按任何规则排序。

@see http://docs.angularjs.org/api/ng.filter:orderBy

于 2012-09-07T03:14:40.590 回答
2
var module = angular.module("example", []);

module.controller("orderByController", function ($scope) {
    $scope.orderByValue = function (value) {
        return value;
    };

    $scope.items = ["c", "b", "a"];
    $scope.objList = [
        {
            "name": "c"
        }, {
            "name": "b"
        }, {
            "name": "a"
        }];
        $scope.item = "b";
    });

http://jsfiddle.net/Nfv42/65/

于 2015-02-26T17:06:20.173 回答
0

对于想要在第三层对变量进行排序的任何人:

<select ng-option="friend.pet.name for friend in friends"></select>

你可以这样做

<select ng-option="friend.pet.name for friend in friends | orderBy: 'pet.name'"></select>
于 2018-03-07T04:47:02.633 回答