Разбиение на страницы в списке с помощью ng-repeat



Я пытаюсь добавить страницы в список. Я следовал учебнику AngularJS, тому, что касается смартфонов, и я пытаюсь отобразить только определенное количество объектов. Вот мой 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>


я добавил тег select с некоторыми значениями, чтобы ограничить количество элементов, которые будут отображаться. Теперь я хочу добавить разбиение на страницы для отображения следующих 5, 10 и т. д.



у меня есть контроллер, который работает с этим:



function PhoneListCtrl($scope, Phone){
$scope.phones = Phone.query();
$scope.orderProp = 'age';
$scope.limit = 5;
}


а также у меня модуль для извлечения данных из файлов json.



angular.module('phonecatServices', ['ngResource']).
factory('Phone', function($resource){
return $resource('phones/:phoneId.json', {}, {
query: {method: 'GET', params:{phoneId:'phones'}, isArray:true}
});
});
541   6  

6 ответов:

Если у вас не слишком много данных, вы можете определенно сделать разбиение на страницы, просто сохраняя все данные в браузере и фильтруя то, что видно в определенное время.

вот простой пример разбиения на страницы:http://jsfiddle.net/2ZzZB/56/

этот пример был в списке скрипок на угловом.JS GitHub wiki, что должно быть полезно:https://github.com/angular/angular.js/wiki/JsFiddle-Examples

изменить: http://jsfiddle.net/2ZzZB/16/ к http://jsfiddle.net/2ZzZB/56/ (не будет показывать "1/4. 5", если есть 45 результатов)

Я только что сделал JSFiddle, который показывает разбиение на страницы + поиск + порядок по каждому столбцу с помощью построить с Twitter Bootstrap код: http://jsfiddle.net/SAWsA/11/

Я построил модуль, который делает разбиение на страницы в памяти невероятно простым.

Это позволяет разбивать на страницы, просто заменив ng-repeat С dir-paginate, указав элементы на странице в качестве конвейерного фильтра, а затем отбрасывая элементы управления, где вам нравится в виде одной директивы,<dir-pagination-controls>

чтобы взять исходный пример, заданный Томарто, это будет выглядеть так:

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

в вашем контроллере нет необходимости в каком-либо специальном коде разбиения на страницы. Все это обрабатывается внутри модуля.

демо: http://plnkr.co/edit/Wtkv71LIqUR4OhzhgpqL?p=preview

источник: дирпагинация GitHub

Я знаю, что эта тема старая сейчас, но я отвечаю на нее, чтобы держать вещи немного обновлены.

С Angular 1.4 и выше, вы можете напрямую использовать limitTo "фильтр", который помимо приема limit параметр также принимает

проверьте эту Директиву:https://github.com/samu/angular-table

Он автоматизирует сортировку и разбиение на страницы и дает вам достаточно свободы, чтобы настроить таблицу/список, однако, вы хотите.

вот демо-код, где есть разбиение на страницы + фильтрация с 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>

Comments

    Ничего не найдено.