Próbuję dodać strony do mojej listy. Postępowałem zgodnie z tutorialem AngularJS, tym o smartfonach i próbuję wyświetlić tylko określoną liczbę obiektów. Oto mój plik html:
<div class='container-fluid'>
<div class='row-fluid'>
<div class='span2'>
Search: <input ng-model='searchBar'>
Sort by:
<select ng-model='orderProp'>
<option value='name'>Alphabetical</option>
<option value='age'>Newest</option>
</select>
You selected the phones to be ordered by: {{orderProp}}
</div>
<div class='span10'>
<select ng-model='limit'>
<option value='5'>Show 5 per page</option>
<option value='10'>Show 10 per page</option>
<option value='15'>Show 15 per page</option>
<option value='20'>Show 20 per page</option>
</select>
<ul class='phones'>
<li class='thumbnail' ng-repeat='phone in phones | filter:searchBar | orderBy:orderProp | limitTo:limit'>
<a href='#/phones/{{phone.id}}' class='thumb'><img ng-src='{{phone.imageUrl}}'></a>
<a href='#/phones/{{phone.id}}'>{{phone.name}}</a>
<p>{{phone.snippet}}</p>
</li>
</ul>
</div>
</div>
</div>
Dodałem tag wyboru z niektórymi wartościami, aby ograniczyć liczbę elementów, które będą wyświetlane. Teraz chcę dodać paginację, aby wyświetlić następne 5, 10 itd.
Mam kontroler, który działa z tym:
function PhoneListCtrl($scope, Phone){
$scope.phones = Phone.query();
$scope.orderProp = 'age';
$scope.limit = 5;
}
Mam też moduł do pobierania danych z plików json.
angular.module('phonecatServices', ['ngResource']).
factory('Phone', function($resource){
return $resource('phones/:phoneId.json', {}, {
query: {method: 'GET', params:{phoneId:'phones'}, isArray:true}
});
});
javascript
angularjs
paginate
Tomarto
źródło
źródło
Odpowiedzi:
Jeśli nie masz za dużo danych, zdecydowanie możesz zrobić paginację, po prostu przechowując wszystkie dane w przeglądarce i filtrując to, co jest widoczne w określonym czasie.
Oto prosty przykład paginacji: http://jsfiddle.net/2ZzZB/56/
Ten przykład był na liście skrzypiec na github wiki angular.js, co powinno być pomocne: https://github.com/angular/angular.js/wiki/JsFiddle-Examples
EDYTUJ: http://jsfiddle.net/2ZzZB/16/ do http://jsfiddle.net/2ZzZB/56/ (nie wyświetla „1 / 4.5”, jeśli jest 45 wyników)
źródło
if (input?)
warunek przed zwroteminput.slice(start)
, dzięki Andy!Właśnie utworzyłem JSFiddle, który pokazuje paginację + wyszukiwanie + porządek w każdej kolumnie przy użyciu kodu Bootstrap Build with Twitter : http://jsfiddle.net/SAWsA/11/
źródło
Zbudowałem moduł, który sprawia, że paginacja w pamięci jest niezwykle prosta.
Pozwala na paginację, po prostu zastępując
ng-repeat
jądir-paginate
, określając elementy na stronie jako filtr potokowy, a następnie upuszczając kontrolki w dowolnym miejscu w formie pojedynczej dyrektywy,<dir-pagination-controls>
Aby wziąć oryginalny przykład zadany przez Tomarto, wyglądałoby to tak:
<ul class='phones'> <li class='thumbnail' dir-paginate='phone in phones | filter:searchBar | orderBy:orderProp | limitTo:limit | itemsPerPage: limit'> <a href='#/phones/{{phone.id}}' class='thumb'><img ng-src='{{phone.imageUrl}}'></a> <a href='#/phones/{{phone.id}}'>{{phone.name}}</a> <p>{{phone.snippet}}</p> </li> </ul> <dir-pagination-controls></dir-pagination-controls>
Nie ma potrzeby stosowania żadnego specjalnego kodu paginacji w kontrolerze. Całość jest obsługiwana wewnętrznie przez moduł.
Demo: http://plnkr.co/edit/Wtkv71LIqUR4OhzhgpqL?p=preview
Źródło: dirPagination of GitHub
źródło
Wiem, że ten wątek jest teraz stary, ale odpowiadam na niego, aby trochę zaktualizować.
W Angular 1.4 i nowszych można bezpośrednio użyć filtra limitTo, który oprócz akceptacji
limit
parametru akceptuje równieżbegin
parametr.Stosowanie:
{{ limitTo_expression | limitTo : limit : begin}}
Więc teraz możesz nie potrzebować żadnej biblioteki innej firmy, aby osiągnąć coś takiego jak paginacja. Stworzyłem skrzypce, aby to zilustrować.
źródło
Sprawdź tę dyrektywę: https://github.com/samu/angular-table
Znacznie automatyzuje sortowanie i paginację oraz zapewnia wystarczającą swobodę dostosowywania tabeli / listy w dowolny sposób.
źródło
$index
a moja tablica nie zawiera wartości przyrostowych<td at-sortable at-attribute="index">{{sortedAndPaginatedList.indexOf(item) + 1}}</td>
ale nie wiem, czy to jest właściwa drogaOto kod demonstracyjny, w którym jest paginacja + filtrowanie za pomocą AngularJS:
https://codepen.io/lamjaguar/pen/yOrVym
JS:
var app=angular.module('myApp', []); // alternate - https://github.com/michaelbromley/angularUtils/tree/master/src/directives/pagination // alternate - http://fdietz.github.io/recipes-with-angular-js/common-user-interface-patterns/paginating-through-client-side-data.html app.controller('MyCtrl', ['$scope', '$filter', function ($scope, $filter) { $scope.currentPage = 0; $scope.pageSize = 10; $scope.data = []; $scope.q = ''; $scope.getData = function () { // needed for the pagination calc // https://docs.angularjs.org/api/ng/filter/filter return $filter('filter')($scope.data, $scope.q) /* // manual filter // if u used this, remove the filter from html, remove above line and replace data with getData() var arr = []; if($scope.q == '') { arr = $scope.data; } else { for(var ea in $scope.data) { if($scope.data[ea].indexOf($scope.q) > -1) { arr.push( $scope.data[ea] ); } } } return arr; */ } $scope.numberOfPages=function(){ return Math.ceil($scope.getData().length/$scope.pageSize); } for (var i=0; i<65; i++) { $scope.data.push("Item "+i); } // A watch to bring us back to the // first pagination after each // filtering $scope.$watch('q', function(newValue,oldValue){ if(oldValue!=newValue){ $scope.currentPage = 0; } },true); }]); //We already have a limitTo filter built-in to angular, //let's make a startFrom filter app.filter('startFrom', function() { return function(input, start) { start = +start; //parse to int return input.slice(start); } });
HTML:
<div ng-app="myApp" ng-controller="MyCtrl"> <input ng-model="q" id="search" class="form-control" placeholder="Filter text"> <select ng-model="pageSize" id="pageSize" class="form-control"> <option value="5">5</option> <option value="10">10</option> <option value="15">15</option> <option value="20">20</option> </select> <ul> <li ng-repeat="item in data | filter:q | startFrom:currentPage*pageSize | limitTo:pageSize"> {{item}} </li> </ul> <button ng-disabled="currentPage == 0" ng-click="currentPage=currentPage-1"> Previous </button> {{currentPage+1}}/{{numberOfPages()}} <button ng-disabled="currentPage >= getData().length/pageSize - 1" ng-click="currentPage=currentPage+1"> Next </button> </div>
źródło