在AngularJS中按字母排序下拉列表


158

我通过使用ng-option填充了一个下拉列表,该下拉列表挂接到了依次调用服务的控制器上。不幸的是,输入的数据是一团糟,我需要能够按字母顺序对其进行排序。

您认为类似的事情$.sortBy可以做到,但不幸的是,它并没有成功。我知道我可以使用辅助方法function asc(a,b)或类似方法通过javascript对其进行排序,但我拒绝相信没有更干净的方法可以执行此操作,而且我不想使用辅助方法来夸大控制器。原则上,它是如此基本,所以我不理解为什么AngularJS没有这个。

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

例:

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

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

Answers:


342

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>

1
看小提琴(或在Angular ToDo教程中添加排序选择标签),获取显示为“已选择”的选项-甚至获取显示的第一个选项-都是一个问题。使用Angular还是空白?
Dave Everitt

2
@DaveEveritt设置默认值(并删除空白项目)的一种方法是为预先选择一个绑定项目selected。对于此示例,您可以执行类似的操作$scope.selected = $scope.friends[0]。有关工作示例,请参见此提琴
Gloopy

如果我希望年龄作为所选值而不是整个JSON元素的值怎么办?
Rishi'3

@Rishi为ng-options尝试一下:f.age as f.name for f in friends | orderBy:'name'- 是一个有效的小提琴。更多关于ng-options的信息
Gloopy

7
@Gloopy,这个答案使我90%地成功了。您介意为使用跟踪依据添加案例吗?<select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name' track by f.id"></selected>。放置track by订单过滤器并不直观,此答案是google的顶级搜索结果。
MushinNoShin 2015年

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


6
或者只是<select ng-option =“ item.name for item in item | orderBy:'-name'”> </ select>也适用:)
Mahbub 2012年

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/


2
在此处解释一下如何回答OP的问题和/或您将如何使用它的一些文字将非常有帮助。
肖恩·宾恩

@SeantheBean我已经给小提琴演示了,所以我没有给出解释。
TechnoCrat

2
@TechnoCrat无论如何,最好还是有一个解释。实际上,知道为什么这种解决方案比几年前发布的解决方案更受青睐会特别有趣。或者,它有什么根本不同……
Chipowski

@Chipowski好的。展望未来,我将尝试给出解释以及答案。
TechnoCrat

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.