143 votes

Filtre d'ordre décroissant par date en AngularJs

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

Le livre provient donc d'une api de repos et de nombreux lecteurs y sont attachés. Je veux récupérer le lecteur 'récent'.

Le site created_at 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 par ordre décroissant ?

223voto

CD.. Points 23701

Selon documentation vous pouvez utiliser le reverse argument.

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

Changez votre filtre pour :

orderBy: 'created_at':true

22 votes

Notez son : pas une virgule. (Pour les autres personnes non observantes)

1 votes

Si vous vouliez un bouton de tri, vous pourriez remplacer true par sortDirection. Puis, dans votre scope, définissez $scope.sortDirection = true. Le bouton de clic ressemblerait à ng-click="sortDirection = !sortDirection".

2 votes

Ceux-ci ne fonctionnent que pour la page qui a des données complètes de la table dans une seule page, mais il ne fonctionnera pas pour la pagination .

184voto

Ludwig Magnusson Points 1885

Vous pouvez préfixer l'argument dans orderBy avec un '-' pour avoir un ordre décroissant au lieu d'un ordre 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 votes

Merci, c'est un moyen rapide et facile d'inverser l'ordre.

41voto

igorauad Points 23

Peut-être que cela peut être utile à 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 marché pour moi.

1 votes

Merci. Mes dates étaient des chaînes de caractères saisies au format MMMM dd, YYYY, et je ne parvenais pas à faire en sorte qu'angular les trie correctement à moins d'utiliser une méthode qui construise un objet date. Ça a marché comme sur des roulettes.

0 votes

Cette méthode est correcte. Nous pouvons utiliser cette méthode dans n'importe quel format de date. Merci patron.

17voto

Niels Bom Points 1955

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},
    ];
}

Vous donnera :

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

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

2voto

Michael Points 21

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 du tri dans les options de sélection en tant que telles :

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

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 à ordonner à partir d'un <select> comme dans votre exemple ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X