257 votes

Comment faire de la pagination en AngularJS ?

J'ai un jeu de données d'environ 1000 éléments en mémoire et j'essaie de créer un pager pour ce jeu de données. cet ensemble de données, mais je ne sais pas comment m'y prendre.

J'utilise une fonction de filtre personnalisée pour filtrer les résultats, et cela fonctionne bien, mais j'ai besoin d'obtenir le nombre de pages.

Des indices ?

288voto

Scotty.NET Points 4373

Angular UI Bootstrap - Directive sur la pagination

Vérifiez Bootstrap UI 's directive de pagination . J'ai fini par l'utiliser plutôt que ce qui est affiché ici, car il a suffisamment de fonctionnalités pour mon utilisation actuelle et a une spécification de test approfondie pour l'accompagner.

Voir

<!-- table here -->

<pagination 
  ng-model="currentPage"
  total-items="todos.length"
  max-size="maxSize"  
  boundary-links="true">
</pagination>

<!-- items/page select here if you like -->

Contrôleur

todos.controller("TodoController", function($scope) {
   $scope.filteredTodos = []
  ,$scope.currentPage = 1
  ,$scope.numPerPage = 10
  ,$scope.maxSize = 5;

  $scope.makeTodos = function() {
    $scope.todos = [];
    for (i=1;i<=1000;i++) {
      $scope.todos.push({ text:"todo "+i, done:false});
    }
  };
  $scope.makeTodos(); 

  $scope.$watch("currentPage + numPerPage", function() {
    var begin = (($scope.currentPage - 1) * $scope.numPerPage)
    , end = begin + $scope.numPerPage;

    $scope.filteredTodos = $scope.todos.slice(begin, end);
  });
});

J'ai fait un plunker de travail pour référence.


Version héritée :

Voir

<!-- table here -->

<div data-pagination="" data-num-pages="numPages()" 
  data-current-page="currentPage" data-max-size="maxSize"  
  data-boundary-links="true"></div>

<!-- items/page select here if you like -->

Contrôleur

todos.controller("TodoController", function($scope) {
   $scope.filteredTodos = []
  ,$scope.currentPage = 1
  ,$scope.numPerPage = 10
  ,$scope.maxSize = 5;

  $scope.makeTodos = function() {
    $scope.todos = [];
    for (i=1;i<=1000;i++) {
      $scope.todos.push({ text:"todo "+i, done:false});
    }
  };
  $scope.makeTodos(); 

  $scope.numPages = function () {
    return Math.ceil($scope.todos.length / $scope.numPerPage);
  };

  $scope.$watch("currentPage + numPerPage", function() {
    var begin = (($scope.currentPage - 1) * $scope.numPerPage)
    , end = begin + $scope.numPerPage;

    $scope.filteredTodos = $scope.todos.slice(begin, end);
  });
});

J'ai fait un plunker de travail pour référence.

2 votes

Agréable et élégant. Il pourrait être amélioré en ajoutant une sorte

3 votes

L'attribut num-pages n'est plus nécessaire et est en lecture seule. Il n'est pas nécessaire de passer numPages. Voir la documentation : angular-ui.github.io/bootstrap/#/pagination

0 votes

Angular bootstrap ui est pour moi une grosse dépendance donc nous pourrions utiliser une solution pure.

88voto

btford Points 4373

J'ai récemment implémenté la pagination pour le site Built with Angular. Vous pouvez consulter la source : https://github.com/angular/builtwith.angularjs.org

J'éviterais d'utiliser un filtre pour séparer les pages. Vous devriez séparer les éléments en pages dans le contrôleur.

61 votes

La solution est répartie sur plusieurs fichiers. Vous devez regarder au moins dans le contrôleur et la vue. Je ne vois pas comment cela justifie un downvote : Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect.

2 votes

Vous pouvez commencer par regarder la <div class="pagination"> de index.html github.com/angular/builtwith.angularjs.org/blob/master/

6 votes

@btford Pourquoi éviter d'utiliser un filtre ?

78voto

Michael Bromley Points 774

J'ai eu à mettre en œuvre la pagination à plusieurs reprises avec Angular, et c'était toujours un peu difficile pour quelque chose qui me semblait pouvoir être simplifié. J'ai utilisé certaines des idées présentées ici et ailleurs pour réaliser un module de pagination qui rend la pagination aussi simple que :

<ul>
    <li dir-paginate="item in items | itemsPerPage: 10">{{ item }}</li>
</ul>

// then somewhere else on the page ....

<dir-pagination-controls></dir-pagination-controls>

C'est tout. Il a les caractéristiques suivantes :

  • Aucun code personnalisé n'est nécessaire dans votre contrôleur pour lier la collection. items aux liens de pagination.
  • Vous n'êtes pas obligé d'utiliser un tableau ou un gridview - vous pouvez paginer tout ce que vous pouvez ng-repeat !
  • Délégués à ng-repeat Vous pouvez donc utiliser n'importe quelle expression qui pourrait être utilisée de manière valide dans un formulaire de demande d'accès à l'information. ng-repeat y compris le filtrage, la commande, etc.
  • Fonctionne sur tous les contrôleurs - le pagination-controls n'a pas besoin de savoir quoi que ce soit sur le contexte dans lequel la directive paginate est appelée.

Démo : http://plnkr.co/edit/Wtkv71LIqUR4OhzhgpqL?p=preview

Pour ceux qui recherchent une solution "plug and play", je pense que vous trouverez cela utile.

Code

Le code est disponible ici sur GitHub et comprend un bon ensemble de tests :

https://github.com/michaelbromley/angularUtils/tree/master/src/directives/pagination

Si vous êtes intéressé, j'ai également écrit un court article qui donne un peu plus de détails sur la conception du module : http://www.michaelbromley.co.uk/blog/108/paginate-almost-anything-in-angularjs/

0 votes

Bonjour @michael bromley, j'essaie avec angularUtils. J'ai ajouté les fichiers dirPangination.js et dirPagination.tpl.html à mon projet. Mais j'ai commencé à avoir des erreurs comme " [$compile:tpload] Failed to load template : directives/pagination/dirPagination.tpl.html". J'ai essayé de placer ce fichier html dans le dossier directives de mon projet. Mais je n'ai pas réussi. J'ai les doutes suivants : 1. Où mettre dirPagination.tpl.html dans le projet (car j'utilise ruby on rails avec Angularjs) ?

0 votes

Bonjour @michael bromley, est-il nécessaire d'inclure dir-paginate pour pouvoir utiliser dir-pagination-controls ?

0 votes

@Vieenay Veuillez ouvrir un sur le dépôt GitHub - c'est un meilleur forum pour ce genre de question.

64voto

Spir Points 1106

Je viens de faire un JSFiddle qui montre la pagination + la recherche + l'ordre par sur chaque colonne en utilisant le code btford : http://jsfiddle.net/SAWsA/11/

0 votes

L'ordre des chiffres est un peu différent, mais dans l'ensemble, il semble très solide.

0 votes

En effet, le $filter('orderBy') prendre le numéro comme chaîne de caractères. Je ne sais pas comment réparer cela

0 votes

Je pense que c'est parce que ce sont des chaînes de caractères dans le tableau d'objets ;)

15voto

user2176745 Points 153

J'ai mis à jour Scotty.NET's plunkr http://plnkr.co/edit/FUeWwDu0XzO51lyLAEIA?p=preview afin qu'il utilise les nouvelles versions d'angular, angular-ui et bootstrap.

Contrôleur

var todos = angular.module('todos', ['ui.bootstrap']);

todos.controller('TodoController', function($scope) {
  $scope.filteredTodos = [];
  $scope.itemsPerPage = 30;
  $scope.currentPage = 4;

  $scope.makeTodos = function() {
    $scope.todos = [];
    for (i=1;i<=1000;i++) {
      $scope.todos.push({ text:'todo '+i, done:false});
    }
  };

  $scope.figureOutTodosToDisplay = function() {
    var begin = (($scope.currentPage - 1) * $scope.itemsPerPage);
    var end = begin + $scope.itemsPerPage;
    $scope.filteredTodos = $scope.todos.slice(begin, end);
  };

  $scope.makeTodos(); 
  $scope.figureOutTodosToDisplay();

  $scope.pageChanged = function() {
    $scope.figureOutTodosToDisplay();
  };

});

Composant d'interface utilisateur Bootstrap

 <pagination boundary-links="true" 
    max-size="3" 
    items-per-page="itemsPerPage"
    total-items="todos.length" 
    ng-model="currentPage" 
    ng-change="pageChanged()"></pagination>

0 votes

Cette solution actualisée a vraiment répondu à mes besoins. Merci beaucoup.

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