Filter für absteigende Reihenfolge nach Datum in AngularJs


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

Das Buch stammt also von Rest API und hat viele Leser angehängt. Ich möchte den "letzten" Leser bekommen.

Das created_atFeld hat den Wert, der den Benutzer als aktuell identifiziert. Aber der obige Code gibt mir den ältesten Leser. Also muss die Reihenfolge umgekehrt werden? Gibt es eine Möglichkeit, die Sortierung in absteigender Reihenfolge durchzuführen?

Antworten:


219

Laut Dokumentation können Sie das reverseArgument verwenden.

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

Ändern Sie Ihren Filter in:

orderBy: 'created_at':true

21
Beachten Sie, dass es :kein Komma ist. (Für andere nicht beobachtende Personen)
ReactiveRaven

1
Wenn Sie eine Sortierschaltfläche möchten, können Sie true durch sortDirection ersetzen. Dann setzen Sie in Ihrem Bereich $ scope.sortDirection = true. Die Klick-Schaltfläche würde aussehen wie ng-click = "sortDirection =! SortDirection"
mbokil

1
Diese funktionieren nur für die Seite, die vollständige Tabellendaten auf einer einzelnen Seite enthält, aber nicht für die Paginierung.
ANK

Link zur Dokumentation ist defekt
Robert

180

Sie können dem Argument orderByein '-' voranstellen , um eine absteigende Reihenfolge anstelle einer aufsteigenden Reihenfolge zu erhalten. Ich würde es so schreiben:

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

Dies ist auch in der Dokumentation zum Filter orderBy angegeben .


6
Vielen Dank, dies ist eine schöne schnelle und einfache Möglichkeit, die Reihenfolge umzukehren.
LukeP

41

Vielleicht kann dies für jemanden nützlich sein:

In meinem Fall erhielt ich eine Reihe von Objekten, die jeweils ein von Mongoose festgelegtes Datum enthielten.

Ich benutzte:

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

Und definierte die Funktion:

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

Das hat bei mir funktioniert.


1
Danke dir. Meine Datumsangaben waren Zeichenfolgen, die in einem MMMM-TT-, JJJJ-Format eingegeben wurden, und ich konnte nicht herausfinden, wie man Winkel erhält, um sie korrekt zu sortieren, es sei denn, ich habe eine Methode verwendet, die ein Datumsobjekt erstellt. Lief wie am Schnürchen.
Zargoon

Dies ist die richtige Methode. Wir können diese Methode in jedem Datumsformat verwenden. Danke Boss
Jethik

17

Und ein Codebeispiel:

<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>

Und das JavaScript:

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

Werde dir geben:

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

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


7

Absteigend Nach Datum sortieren

Es ist hilfreich, Datensätze mit Datum in absteigender Reihenfolge zu filtern.

$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

In meinem Fall wird die Bestellung durch ein Auswahlfeld bestimmt. Ich bevorzuge Ludwigs Antwort, weil Sie die Sortierrichtung in den Auswahloptionen als solche festlegen können:

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

Markup:

<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
Dies scheint mit benutzerdefinierten Sortierfunktionen nicht zu funktionieren. Gibt es eine Möglichkeit, die Sortierung umzukehren, wenn Sie eine benutzerdefinierte orderBy-Funktion verwenden und einen Parameter auswählen, nach dem aus einer <Auswahl> sortiert werden soll, wie in Ihrem Beispiel?
cre8value

0

Siehe Beispiele für w3schools: https://www.w3schools.com/angular/angular_filters.asp https://www.w3schools.com/angular/tryit.asp?filename=try_ng_filters_orderby_click

Fügen Sie dann das "Reverse" -Flag hinzu:

<!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

Mein Ratschlag use moment () ist einfach zu verwalten, wenn es sich um Zeichenfolgenwerte handelt

//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>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.