2013-10-04 11 views
10

Ho appena preso la demo più semplice da http://docs.angularjs.org/api/ng.filter:orderBy e semplicemente modificare il valore dell'età per avere un numero diverso di cifre. Smette di funzionare come previsto. Il suo ordine come "stringa" non come valore "intero". Come dovrei cambiarlo in modo che ordini per età come valore intero?AngularJS campo intero di ordinamento non funziona correttamente

Plunkr demo è qui http://plnkr.co/edit/pzgiIYrki7jUZdVaTMt9?p=preview

codici sono:

function Ctrl($scope) { 
    $scope.friends = 
     [{name:'John', phone:'555-1212', age:'2352345'}, 
     {name:'Mary', phone:'555-9876', age:'4235243'}, 
     {name:'Mike', phone:'555-4321', age:'241'}, 
     {name:'Adam', phone:'555-5678', age:'34325'}, 
     {name:'Julie', phone:'555-8765', age:'1234'}] 
    $scope.predicate = '-age'; 
} 


<!doctype html> 
<html ng-app="App"> 
    <head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular.min.js"></script> 
<script type="text/javascript" src="script.js"></script> 
</head> 
    <body> 

<div ng-controller="Ctrl"> 
    <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre> 
    <hr/> 
    [ <a href="" ng-click="predicate=''">unsorted</a> ] 
    <table class="friend"> 
    <tr> 
     <th><a href="" ng-click="predicate = 'name'; reverse=false">Name</a> 
      (<a href="" ng-click="predicate = '-name'; reverse=false">^</a>)</th> 
     <th><a href="" ng-click="predicate = 'phone'; reverse=!reverse">Phone Number</a></th> 
     <th><a href="" ng-click="predicate = 'age'; reverse=!reverse">Age</a></th> 
    </tr> 
    <tr ng-repeat="friend in friends | orderBy:predicate:reverse"> 
     <td>{{friend.name}}</td> 
     <td>{{friend.phone}}</td> 
     <td>{{friend.age}}</td> 
    </tr> 
    </table> 
</div> 


    </body> 
</html> 
+0

aggiunsi altra risposta che lavorerà per voi –

risposta

18

è necessario convertire età per tipo di numero di far orderBy a lavorare come dovrebbe.

Aggiungi al controller per ordinare età String come float:

angular.forEach($scope.friends, function (friend) { 
    friend.age = parseFloat(friend.age); 
    }); 

Si dovrebbe funzionare,

Vedi PLunker

+0

dalla tua risposta precedente, ero stato googling per come rimuovere preventivo o convertire in numero intero troppo. Ho trovato anche questa risposta, in questo modo dovrebbe essere l'unica soluzione per ora suppongo :) ... a meno che non abbia una grande lista e debba passare attraverso, allora sarà una cattiva pratica, non è così: S – cjmling

+1

? A meno che io avere una grande lista e ha dovuto foreach through', giusto, ma lo fai solo una volta durante la compilazione. Ho ordinato per intero una volta 85M json 150k di oggetti. Mi ci sono voluti 4 sec, quindi non preoccuparti –

+0

Prova a testarlo con remove Quotes o converti in Integer con il timer –

1

Non vi resta che rimuovere le citazioni in variabile età, perché si tratta di un numero intero, non una stringa:

$scope.friends = 
     [{name:'John', phone:'555-1212', age:2352345}, 
     {name:'Mary', phone:'555-9876', age:4235243}, 
     {name:'Mike', phone:'555-4321', age:241}, 
     {name:'Adam', phone:'555-5678', age:34325}, 
     {name:'Julie', phone:'555-8765', age:1234}] 
11

So che è un po 'tardi per questa risposta, ma nella versione più recente di Angular, è possibile utilizzare una funzione come predicato orderBy (https://docs.angularjs.org/api/ng/filter/orderBy). In questo caso, aggiungere al controllore una funzione come prossimo

$scope.orderByFunction = function(friend){ 
    return parseInt(friend.age); 
}; 

e cambiare il predicato nel orderBy filtrare

ng-repeat="friend in friends | orderBy:orderByFunction:reverse" 

Questo farà il trucco!

+0

aggiungendo a quanto sopra, Nel caso in cui se questo deve essere applicato in un controller, è necessario fare qualcosa come questo array = orderBy ($ scope.topMacsArray, 'parseInt (count, 10)', true); dove vero significa "invertire" l'ordine. –

-1

Aggiungere codice JSON_NUMERIC_CHECK durante la conversione array in JSON. json_encode ($ anyarray, JSON_NUMERIC_CHECK);

0

Cambiare il predicato al seguente funziona anche:

<th><a href="" ng-click="predicate = '1*age'; reverse=!reverse">Age</a></th> 
Problemi correlati