<div class="recent" ng-repeat="reader in
(filteredItems = (book.reader | orderBy: 'created_at' | limitTo: 1))">
</div>
Donc, le livre vient de repos api et il a de nombreux lecteurs attachés. Je veux avoir le lecteur "récent".
Le champ created_at
a la valeur qui identifie l'utilisateur comme étant récent. Mais le code ci-dessus me donne le lecteur le plus âgé. Donc, l'ordre doit être inversé? Existe-t-il un moyen de trier par ordre décroissant?
Selon documentation , vous pouvez utiliser l'argument reverse
.
filter:orderBy(array, expression[, reverse]);
Changez votre filtre en:
orderBy: 'created_at':true
Vous pouvez préfixer l'argument dans orderBy
avec un '-' pour avoir un ordre décroissant plutôt que 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 .
Peut-être que cela peut être utile pour quelqu'un:
Dans mon cas, je recevais un tableau d'objets, chacun contenant une date définie 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.
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/
Tri décroissant par date
Il sera utile de 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>
Dans mon cas, le orderBy est déterminé par une zone de sélection. Je préfère la réponse de Ludwig parce que vous pouvez définir la direction du tri dans les options de sélection telles que:
$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>
Mon conseil d'utilisation moment () est facile à gérer les dates s'il s'agit de 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"
voir des exemples w3schools: https://www.w3schools.com/angular/angular_filters.asphttps://www.w3schools.com/angular/tryit.asp?filename=try_ng_filters_orderby_click
puis ajoutez le drapeau "reverse":
<!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>