AngularJSでドロップダウンをアルファベット順に並べ替える


158

ng-optionsを使用してドロップダウンに値を入力します。ng-optionsは、サービスを呼び出すコントローラーにフックされています。残念ながら、入ってくるデータはごちゃごちゃしているので、アルファベット順にソートできるようにする必要があります。

あなたは何か$.sortByがそれをするだろうと思っていますが、残念ながらそれはジャックをしませんでした。私はそれをヘルパーメソッドfunction asc(a,b)またはそのようなものでJavaScriptを介して並べ替えることができることを知っていますが、これを行うよりクリーンな方法はなく、ヘルパーメソッドでコントローラーを膨らませたくないとは思いません。これは基本的にとても基本的なものなので、なぜAngularJSにこれがないのかわかりません。

のようなことをする方法はあり$orderBy('asc')ますか?

例:

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

orderBy通常はデータをソートしようとするときはいつでも、必要なことをすべて実行できるようにするオプションがあると非常に便利です。

回答:


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 2013

2
@DaveEverittでデフォルトを設定(および空白の項目を削除)する1つの方法は、のバインドされた項目を事前に選択することですselected。この例では、次のようなことができます$scope.selected = $scope.friends[0]。実用的なサンプルについては、このフィドルを参照してください。
Gloopy 2013

JSON要素全体ではなく、年齢を値として選択したい場合はどうすればよいですか?
Rishi

NG-オプションのためにこれを試してください@Rishi:f.age as f.name for f in friends | orderBy:'name'- ここでは、作業フィドルです。ng-optionsの詳細はこちら
Gloopy、2015年

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

orderByreverseフラグの3番目のオプションを受け入れることができます。

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

ここでは、アイテムは「名前」プロパティで逆順にソートされています。2番目の引数は任意の順序関数にすることができるため、任意のルールで並べ替えることができます。

@http //docs.angularjs.org/api/ng.filter :orderByを参照


6
または、単に<select ng-option = "item.name for item in items | orderBy: '-name'"> </ select>も機能します:)
Mahbub

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の質問にどのように答えるか、および/またはそれをどのように使用するかを説明する少しのテキストは、ここで非常に役立ちます。
Sean the Bean

@SeantheBean私はすでにフィドルデモを行っているので、説明はしていません。
TechnoCrat、2016年

2
@TechnoCratとにかく説明が望ましいでしょう。実際、このソリューションが何年も前に投稿されたソリューションよりも好まれる理由を知ることは特に興味深いでしょう。または、それがどのようにまったく異なるか...
チポウスキー

@Chipowskiわかりました。今後は、回答とともに説明していきます。
TechnoCrat 2017

0

変数を第3層でソートしたい場合:

<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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.