Mengurutkan dropdown secara alfabet di AngularJS

158

Saya mengisi dropdown melalui penggunaan opsi-ng yang terhubung ke controller yang pada gilirannya memanggil layanan. Sayangnya data yang masuk berantakan dan saya harus bisa mengurutkannya berdasarkan abjad.

Anda pikir sesuatu seperti $.sortByakan melakukannya tetapi sayangnya itu tidak berhasil. Saya tahu saya bisa mengatasinya melalui javascript dengan metode pembantu function asc(a,b)atau sesuatu seperti itu tetapi saya menolak untuk percaya bahwa tidak ada cara yang lebih bersih untuk melakukan ini ditambah saya tidak ingin mengasapi controller dengan metode pembantu. Ini adalah sesuatu yang sangat mendasar pada prinsipnya jadi saya tidak mengerti mengapa AngularJS tidak memiliki ini.

Apakah ada cara melakukan sesuatu seperti $orderBy('asc')?

Contoh:

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

Akan sangat berguna untuk memiliki opsi orderBysehingga Anda dapat melakukan apa pun yang Anda inginkan, kapan pun Anda biasanya mencoba mengurutkan data.

J Castillo
sumber

Jawaban:

342

Angular memiliki filter orderBy yang dapat digunakan seperti ini:

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

Lihat biola ini sebagai contoh.

Perlu dicatat bahwa jika track bysedang digunakan perlu muncul setelah orderByfilter, seperti ini:

<select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name' track by f.id"></select>
Gloopy
sumber
1
Melihat biola (atau menambahkan semacam tag pilih ke tutorial Angular ToDo), mendapatkan opsi untuk ditampilkan sebagai 'terpilih' - atau bahkan mendapatkan opsi pertama untuk ditampilkan - adalah masalah. Dengan Angular itu kosong?
Dave Everitt
2
@DaveEveritt salah satu cara untuk menetapkan default (dan menghapus item kosong) adalah dengan memilih dulu item yang terikat selected. Untuk contoh ini, Anda dapat melakukan sesuatu seperti $scope.selected = $scope.friends[0]. Lihat biola ini untuk sampel yang berfungsi.
Gloopy
bagaimana jika saya ingin umur sebagai nilai dalam dipilih, bukan elemen JSON keseluruhan?
Rishi
@Rishi coba ini untuk ng-pilihan: f.age as f.name for f in friends | orderBy:'name'- di sini adalah biola bekerja. Lebih lanjut tentang opsi-ng di sini .
Gloopy
7
@ Gopy, Jawaban ini membuat saya 90% dari perjalanan ke sana. Maukah Anda menambahkan kasing ketika lagu dilacak digunakan? <select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name' track by f.id"></selected>. Menempatkan track bysetelah filter pesanan tidak intuitif dan jawaban ini adalah hasil pencarian teratas dari google.
MushinNoShin
26

Anda harus dapat menggunakan filter: orderBy

orderBydapat menerima opsi ketiga untuk reversebendera.

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

Di sini item diurutkan berdasarkan properti 'nama' dalam urutan terbalik. Argumen ke-2 dapat berupa fungsi pesanan apa pun, sehingga Anda dapat mengurutkan aturan apa pun.

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

Omong kosong
sumber
6
Atau cukup <pilih ng-option = "item.name untuk item di item | orderBy: '- name'"> </select> Bekerja juga :)
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/

TechnoCrat
sumber
2
Sedikit teks yang menjelaskan bagaimana ini menjawab pertanyaan OP dan / atau bagaimana Anda akan menggunakannya akan sangat membantu di sini.
Sean the Bean
@ SeantheBean saya sudah memberikan demo biola jadi saya belum memberikan penjelasan.
TechnoCrat
2
@ TechnoCrat Penjelasan tetap akan lebih disukai. Bahkan, akan sangat menarik untuk mengetahui mengapa solusi ini lebih disukai daripada yang diposting tahun sebelumnya. Atau, betapa
berbedanya
@Chipowski ok. ke depan saya akan mencoba memberikan penjelasan beserta jawabannya.
TechnoCrat
0

Bagi siapa saja yang ingin mengurutkan variabel di lapisan ketiga:

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

Anda bisa melakukannya seperti ini

<select ng-option="friend.pet.name for friend in friends | orderBy: 'pet.name'"></select>
Trieu Nguyen
sumber