Фільтр за спаданням за датою в AngularJs


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

Тож книга виходить із спокою api та до неї додається багато читачів. Я хочу отримати "недавнього" читача.

created_atПоле має значення , яке ідентифікує користувача , як останні. Але наведений вище код дає мені найстаршого читача. Тож замовлення потрібно перевернути? Чи є спосіб сортування в порядку зменшення?

Відповіді:


219

Відповідно до документації можна використовувати reverseаргумент.

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

Змініть фільтр на:

orderBy: 'created_at':true

21
Зауважте, що це :не кома. (Для інших людей, які не спостерігають)
ReactiveRaven

1
Якщо вам потрібна кнопка сортування, ви можете замінити true на sortDirection. Тоді у вашому діапазоні встановіть $ range.sortDirection = true. Кнопка клацання виглядатиме як ng-click = "sortDirection =! SortDirection"
mbokil

1
Вони працюють лише для сторінки, яка має повну табличну інформацію на одній сторінці, але вона не працюватиме для пагинації ..
ANK

посилання на документацію порушено
robert

180

Ви можете встановити аргумент в orderBy"-", щоб мати порядок зменшення, а не висхідний. Я б написав це так:

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

Це також зазначено в документації для фільтра OrderBy .


6
Дякую, це приємний швидкий і простий спосіб змінити замовлення.
LukeP

41

Можливо, це може бути корисним для когось:

У моєму випадку я отримував масив об’єктів, кожен з яких містить дату, встановлену Монгузом.

Я використав:

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

І визначила функцію:

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

Це працювало для мене.


1
Дякую. Мої дати - це рядки, введені у форматі MMMM dd, YYYY, і я не міг зрозуміти, як отримати кутовий, щоб правильно їх сортувати, якщо не використав метод, який побудував об’єкт дати. Працював як шарм.
Заргун

Це правильний метод .. ми можемо використовувати цей метод у будь-якому форматі дати .. дякую босу
Jethik

17

І приклад коду:

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

І JavaScript:

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

Дасть вам:

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

Про JSFiddle: http://jsfiddle.net/agjqN/


7

Сортування за спаданням за датою

Це допоможе фільтрувати записи за датою у порядку зменшення.

$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

У моєму випадку orderBy визначається полем вибору. Я вважаю за краще відповідь Людвіга, тому що ви можете встановити напрямок сортування у вибраних опціях як таких:

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

розмітка:

<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
це, здається, не працює зі спеціальними функціями сортування. Чи є спосіб змінити сортування при використанні функції користувальницького orderBy та вибору параметра для замовлення за допомогою <select>, як у вашому прикладі?
cre8value

0

дивіться зразки w3schools: https://www.w3schools.com/angular/angular_filters.asp https://www.w3schools.com/angular/tryit.asp?filename=try_ng_filters_orderby_click

потім додайте прапор "зворотного":

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

Моя порада використовувати момент () легко керувати датами, якщо вони є значеннями рядків

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.