Filtre par ordre décroissant de date dans AngularJs


139
<div class="recent" ng-repeat="reader in
    (filteredItems = (book.reader | orderBy: 'created_at' | limitTo: 1))">
</div>

Donc, le livre vient de l'api de repos et il a de nombreux lecteurs attachés. Je veux obtenir le lecteur «récent».

Le created_atchamp a la valeur qui identifie l'utilisateur comme récent. Mais le code ci-dessus me donne le lecteur le plus ancien. L'ordre doit donc être inversé? Existe-t-il un moyen d'avoir le tri dans l'ordre décroissant?

Réponses:


219

Selon la documentation, vous pouvez utiliser l' reverseargument.

filter:orderBy(array, expression[, reverse]);

Changez votre filtre pour:

orderBy: 'created_at':true

21
Notez que ce :n'est pas une virgule. (Pour les autres personnes non pratiquantes)
ReactiveRaven

1
Si vous vouliez un bouton de tri, vous pouvez remplacer true par sortDirection. Ensuite, dans votre champ d'application, définissez $ scope.sortDirection = true. Le bouton de clic ressemblerait à ng-click = "sortDirection =! SortDirection"
mbokil

1
Celles-ci ne fonctionnent que pour la page contenant des données de table complètes sur une seule page, mais cela ne fonctionnera pas pour la pagination ..
ANK

lien vers la documentation est cassé
robert

180

Vous pouvez faire précéder l'argument orderByd'un «-» pour avoir un ordre décroissant au lieu de croissant. Je l'écrirais comme ceci:

<div class="recent" 
   ng-repeat="reader in book.reader | orderBy: '-created_at' | limitTo: 1">
</div>

Ceci est également indiqué dans la documentation du filtre orderBy .


6
Merci, c'est un moyen simple et rapide d'inverser l'ordre.
LukeP

41

Peut-être que cela peut être utile pour quelqu'un:

Dans mon cas, je recevais un tableau d'objets, chacun contenant une date fixée par Mongoose.

J'ai utilisé:

ng-repeat="comment in post.comments | orderBy : sortComment : true"

Et défini la fonction:

$scope.sortComment = function(comment) {
    var date = new Date(comment.created);
    return date;
};

Cela a fonctionné pour moi.


1
Je vous remercie. Mes dates étaient des chaînes entrées au format MMMM jj, AAAA, et je ne pouvais pas comprendre comment devenir angulaire pour les trier correctement à moins d'utiliser une méthode qui construit un objet de date. A travaillé comme un charme.
Zargoon

C'est la méthode correcte .. nous pouvons utiliser cette méthode dans n'importe quel format de date .. merci patron
Jethik

17

Et un exemple de code:

<div ng-app>
    <div ng-controller="FooController">
        <ul ng-repeat="item in items | orderBy:'num':true">
            <li>{{item.num}} :: {{item.desc}}</li>
        </ul>
    </div>
</div>

Et le JavaScript:

function FooController($scope) {
    $scope.items = [
        {desc: 'a', num: 1},
        {desc: 'b', num: 2},
        {desc: 'c', num: 3},
    ];
}

Te donnera:

3 :: c
2 :: b
1 :: a

Sur JSFiddle: http://jsfiddle.net/agjqN/


7

Tri décroissant par date

Cela aidera à filtrer les enregistrements avec la date dans l'ordre décroissant.

$scope.logData = [
            { event: 'Payment', created_at: '04/05/17 6:47 PM PST' },
            { event: 'Payment', created_at: '04/06/17 12:47 AM PST' },
            { event: 'Payment', created_at: '04/05/17 1:50 PM PST' }
        ]; 

<div ng-repeat="logs in logData | orderBy: '-created_at'" >
      {{logs.event}}
 </div>

2

Dans mon cas, le orderBy est déterminé par une boîte de sélection. Je préfère la réponse de Ludwig car vous pouvez définir la direction de tri dans les options de sélection en tant que telle:

        $scope.options = [
            { label: 'Title', value: 'title' },
            { label: 'Newest', value: '-publish_date' },
            { label: 'Featured', value: '-featured' }
        ]; 

balisage:

<select ng-model="orderProp" ng-options="opt as opt.label for opt in options"></select>
<ul>
    <li ng-repeat="item in items | orderBy:orderProp.value"></li>
</ul>

1
cela ne semble pas fonctionner avec les fonctions de tri personnalisées. Existe-t-il un moyen d'inverser le tri lors de l'utilisation d'une fonction orderBy personnalisée et de la sélection d'un paramètre à trier à partir d'un <select> comme dans votre exemple?
cre8value

0

voir les exemples w3schools: https://www.w3schools.com/angular/angular_filters.asp https://www.w3schools.com/angular/tryit.asp?filename=try_ng_filters_orderby_click

puis ajoutez le drapeau "inverse":

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>

<p>Click the table headers to change the sorting order:</p>

<div ng-app="myApp" ng-controller="namesCtrl">

<table border="1" width="100%">
<tr>
<th ng-click="orderByMe('name')">Name</th>
<th ng-click="orderByMe('country')">Country</th>
</tr>
<tr ng-repeat="x in names | orderBy:myOrderBy:reverse">
<td>{{x.name}}</td>
<td>{{x.country}}</td>
</tr>
</table>

</div>

<script>
angular.module('myApp', []).controller('namesCtrl', function($scope) {
    $scope.names = [
        {name:'Jani',country:'Norway'},
        {name:'Carl',country:'Sweden'},
        {name:'Margareth',country:'England'},
        {name:'Hege',country:'Norway'},
        {name:'Joe',country:'Denmark'},
        {name:'Gustav',country:'Sweden'},
        {name:'Birgit',country:'Denmark'},
        {name:'Mary',country:'England'},
        {name:'Kai',country:'Norway'}
        ];

    $scope.reverse=false;
    $scope.orderByMe = function(x) {

        if($scope.myOrderBy == x) {
            $scope.reverse=!$scope.reverse;
        }
        $scope.myOrderBy = x;
    }
});
</script>

</body>
</html>

0

Mon conseil d'utilisation moment () est facile à gérer les dates si ce sont des valeurs de chaînes

//controller
$scope.sortBooks = function (reader) {
            var date = moment(reader.endDate, 'DD-MM-YYYY');
            return date;
        };

//template

ng-repeat="reader in book.reader | orderBy : sortBooks : true"

0

var myApp = angular.module('myApp', []);

myApp.filter("toArray", function () {
    return function (obj) {
        var result = [];
        angular.forEach(obj, function (val, key) {
            result.push(val);
        });
        return result;
    };
});


myApp.controller("mainCtrl", function ($scope) {

  $scope.logData = [
              { event: 'Payment', created_at: '10/10/2019 6:47 PM PST' },
              { event: 'Payment', created_at: '20/10/2019 12:47 AM PST' },
              { event: 'Payment', created_at: '30/10/2019 1:50 PM PST' }
          ]; 
        
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>

<div ng-app="myApp" ng-controller="mainCtrl">

  <h4>Descending</h4>
  <ul>
    <li ng-repeat="logs in logData | toArray | orderBy:'created_at':true" >
          {{logs.event}} - Date : {{logs.created_at}}
    </li>
  </ul>
  
  <br>
  
  
  <h4>Ascending</h4>
  <ul>
    <li ng-repeat="logs in logData | toArray | orderBy:'created_at':false" >
          {{logs.event}} - Date : {{logs.created_at}}
    </li>
  </ul>
  
</div>

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.