2013-10-04 17 views
10

Sadece en basit demoyu http://docs.angularjs.org/api/ng.filter:orderBy'dan aldım ve yalnızca farklı sayıya sahip olmak için yaşın değerini değiştirdim. Beklendiği gibi çalışmayı durdurur. "String" gibi "tamsayı" değeri değil. Nasıl değiştirmeliyim ki, yaşlarına göre tamsayı değeri olarak sipariş verilsin mi?AngularJS orderby tamsayı alanı düzgün çalışmıyor

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

i önceki cevabı size –

cevap

18

Eğer olması gerektiği gibi çalışması için orderBy yapmak için Numarası yazmak için yaşını dönüştürmek zorunda:

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

Kodlar vardır burada.

bir çünkü PLunker

+0

için çalışacaktır diğer cevabı ekledi, ben alıntı kaldırmak veya çok tamsayı dönüştürmek için nasıl googling edilmişti. Bu cevabı da buldum, şu an için tek çözüm bu şekilde olmalı :)… eğer büyük bir liste yoksa ve foreach yapmak zorunda olmadıkça, o zaman kötü bir uygulama olacak, değil mi: S – cjmling

+1

' büyük bir listeye sahip ve 'üzerinden geçmek zorunda kaldı, ama derleme sırasında sadece bir kez yaparsınız. Tamsayı bir kere 85M json 150k nesneye göre sıralıyorum. 4 saniye sürdü, bu yüzden endişe yok –

+0

Quotes ile test etmeye çalışın veya zamanlayıcı –

1

sadece yaş değişkeni tırnak kaldırmak zorunda Bkz

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

Bu çalışması gerekir:

şamandıra olarak Dize yaşını sıralamak denetleyicinizdeki ekle tamsayı, bir dize değil:

$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

Bu cevap için biraz geç olduğunu biliyorum, ancak Angular'ın en yeni sürümünde, bir işlevi orderBy'in yüklemi olarak kullanabilirsiniz (https://docs.angularjs.org/api/ng/filter/orderBy). Bu durumda Bu hile olacaktır

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

filtre

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

sonraki

gibi kontrolöre bir işlev eklemek ve orderBy yüklemi değiştirin!

+0

Yukarıdakilere ekleyerek, Bunun bir denetleyicide uygulanması gerekiyorsa, bu dizi gibi bir şey yapmalısınız = orderBy ($ scope.topMacsArray, 'parseInt (count, 10)', true); gerçek, emri "tersine çevirmek" anlamına gelir. –

-1

JSON_NUMERIC_CHECK kodu ekleyin. json_encode ($ anyarray, JSON_NUMERIC_CHECK);

0

aşağıdaki şekilde yüklem de çalışacaktır değiştirme:

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