2015-04-07 11 views
5

Utilizzando la direttiva ngRepeat di Angular JS, come posso fare in modo che le iterazioni risultanti vadano nell'ordine inverso? Sto usando un oggetto in cui le chiavi sono numeri, e mi piacerebbe ordinare da quelle, decrescente.Come invertire l'ordine di Angular ngRepeat per chiavi dell'oggetto che sono numerici

So che non si può realmente ordinare un oggetto con chiavi come questa (senza tenere un riferimento a un array), ma è possibile con Angular?

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.min.js"></script> 
 

 
<body> 
 
    <script> 
 
    var app = angular.module('myApp', []); 
 
    app.filter('orderObjectBy', function() { 
 
     return function(items, field, reverse) { 
 
     var filtered = []; 
 
     angular.forEach(items, function(item) { 
 
      filtered.push(item); 
 
     }); 
 
     filtered.sort(function(a, b) { 
 
      return (a[field] > b[field] ? 1 : -1); 
 
     }); 
 
     if (reverse) filtered.reverse(); 
 
     return filtered; 
 
     }; 
 
    }); 
 
    app.controller('myController', ['$scope', 
 
     function($scope) { 
 
     $scope.data = { 
 
      2013: 'oldest 4', 
 
      2014: 'older 3', 
 
      2015: 'new 2', 
 
      2016: 'newest 1' 
 
     }; 
 
     } 
 
    ]); 
 
    </script> 
 
    <div id="myApp" ng-app='myApp' ng-controller="myController"> 
 
    <div ng-repeat="(date,text) in data">{{text}}</div> 
 
    <hr/> 
 
    <div ng-repeat="(date,text) in data | orderBy:date:reverse">{{text}}</div> 
 
    <hr/> 
 
    <div ng-repeat="(date,text) in data | orderBy:'-date'">{{text}}</div> 
 
    <hr/> 
 
    <div><b>Correct Answer!:</b></div><hr/> 
 
    <div ng-repeat="(date,text) in data | orderObjectBy:date:true">{{text}}</div> 
 
    </div> 
 

 
</body>

per esempio, mi piacerebbe questo per ordinare dal più recente al più vecchio (il contrario di quello che fa in questo codice) opera doen't

+0

Se volete ordinare per data in ordine inverso poi basta mettere '-' prima del nome del campo. Quindi il codice sarà "(data, testo) in data | orderBy: '- date'" – Anita

+0

usa filter .. Voglio dire -ng-repeat = '(date, text) nei dati s | orderBy: date: reverse ' – Ved

+0

Grazie ragazzi, ma ho provato che con il codice aggiornato nella mia domanda non sembra funzionare. –

risposta

5

ng-repeat con l'oggetto per questo è necessario creare il tuo filtro personalizzato.

<div ng-repeat="(date,text) in data | orderObjectBy:date:true">{{text}}</div> 

app.filter('orderObjectBy', function() { 
    return function(items, field, reverse) { 
    var filtered = []; 
    angular.forEach(items, function(item) { 
     filtered.push(item); 
    }); 
    filtered.sort(function (a, b) { 
     return (a[field] > b[field] ? 1 : -1); 
    }); 
    if(reverse) filtered.reverse(); 
    return filtered; 
    }; 
}); 

Plunker

Speranza che aiuta :)

+1

Grazie! Molto utile, davvero. –

+0

@d -_- b contento di aiutarti :) – squiroid

+0

In realtà 'ng-repeat' funziona con l'oggetto (cioè può iterare le sue proprietà). È "orderBy" che non può ordinare tutto tranne gli array. – Javarome

Problemi correlati