2012-09-07 18 views
143

Sto compilando un menu a discesa tramite l'utilizzo di ng-options che è collegato a un controller che a sua volta chiama un servizio. Purtroppo i dati in arrivo sono un disastro e devo essere in grado di ordinarlo alfabeticamente.Ordine a discesa alfabetico in AngularJS

Si capisce che qualcosa come $.sortBy lo farebbe ma sfortunatamente non lo ha fatto jack. So che posso ordinarlo via javascript con un metodo helper function asc(a,b) o qualcosa del genere ma mi rifiuto di credere che non ci sia un modo più pulito per farlo e non voglio gonfiare il controller con metodi helper. È qualcosa di così fondamentale in linea di principio, quindi non capisco perché AngularJS non abbia questo.

C'è un modo per fare qualcosa come $orderBy('asc')?

Esempio:

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

Sarebbe estremamente utile avere opzioni in orderBy in modo da poter fare tutto quello che vuoi, quando di solito si tenta di ordinare i dati.

risposta

304

angolare ha un filtro orderBy che può essere utilizzato in questo modo:

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

Vedi this fiddle per un esempio.

Vale la pena notare che se track by viene utilizzato deve comparire dopo il filtro orderBy, in questo modo:

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

Analizzare, cercare, guardare al violino (o aggiungendo una sorta di tag select al tutorial di Angular ToDo), ottenere un'opzione da mostrare come 'selezionata' - o persino ottenere la prima opzione da mostrare - è un problema. Con Angular è vuoto? –

+2

@DaveEveritt un modo per impostare un valore predefinito (e per rimuovere l'elemento vuoto) consiste nella preselezione di un oggetto associato per 'selected'. Per questo esempio puoi fare qualcosa come '$ scope.selected = $ scope.friends [0]'. Vedi [questo violino] (http://jsfiddle.net/aBccw/142/) per un campione funzionante. – Gloopy

+1

non ha funzionato per me, ma questo sì: http://stackoverflow.com/a/18261445/2178340 – Gerson

23

Si dovrebbe essere in grado di utilizzare il filtro: orderBy

orderBy può accettare un terzo opzione per il flag reverse.

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

Qui la voce è ordinata per la proprietà 'nome' in un ordine inverso. Il secondo argomento può essere una qualsiasi funzione di ordine, quindi è possibile ordinare in qualsiasi regola.

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

+6

Oppure solo Funziona anche :) – Mahbub

0
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

Un po 'di testo che spiega come questo risponde alla domanda dell'OP e/o come lo useresti sarebbe molto utile qui. –

+0

@SeantheBean ho già dato una demo di fiddle quindi non ho dato spiegazioni. – TechnoCrat

+2

@TechnoCrat Una spiegazione sarebbe preferibile comunque. In effetti, sarebbe particolarmente interessante sapere perché questa soluzione sarebbe preferibile rispetto a quella pubblicata anni prima. O come differisce ... – Chipowski

0

Per chi vuole ordinare la variabile nel terzo strato:

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

si può fare in questo modo

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