Директива dir-pagination angularjs: есть ли способ получить все записи текущей страницы в нумерации страниц?

Я использую директиву dir-pagination от @michaelbromley. Я хочу получить все записи на текущей странице директивы. Есть какой-либо способ сделать это?

dir-paginate pic

Вот ссылка: dir-pagination, поэтому мне нужна коллекция из 5 records из От 100 до 96. Есть ли быстрый способ сделать это?

Я пробовал пару вещей, но не работал.


person Samir Shah    schedule 24.04.2015    source источник
comment
plnkr plnkr.co/edit/gJbMTzWQX0g5ClKcINqJ?p=preview   -  person Samir Shah    schedule 24.04.2015
comment
попробуйте это: plnkr.co/edit/7OfKd7xbRHkzFIPlpWS7?p=preview   -  person Samir Shah    schedule 24.04.2015
comment
Вы хотите получить эти 5 записей по нажатию кнопки?   -  person Rathish Cholarajan    schedule 24.04.2015
comment
Да! Если это возможно   -  person Samir Shah    schedule 24.04.2015


Ответы (5)


Вот еще один возможный способ сделать это, не требующий дублирования логики из выражения dir-paginate:

Для каждого повторяющегося элемента вы можете просто вставить этот элемент в массив в своем контроллере. Это, конечно, даст вам все элементы для этой страницы.

Вот пример:

<ul>
   <li dir-paginate="meal in perman  = ( meals | filter:q ) | orderBy: order?'key':'-key' | itemsPerPage: pageSize" current-page="currentPage" ng-init="addMeal(meal)">{{ meal.key + ': ' +meal.val }}</li>
</ul>

Затем в контроллере:

$scope.addMeal = function(meal) {
  if (meal) {
    if ($scope.page.length === $scope.pageSize + 1) {
      $scope.page = [];
    }
    $scope.page.push(meal);
  }
}

Дорого не проверял, но общий принцип должен работать. На мой взгляд, это немного хакерски, но это стоит знать в качестве альтернативы ответу, предоставленному Ратишем.

person Michael Bromley    schedule 28.04.2015
comment
Спасибо Михаил за ответ. Есть ли способ получить текущий индекс страницы в моем контроллере. означает, на какой странице я сейчас нахожусь. - person Samir Shah; 04.05.2015
comment
При использовании запроса с фильтром и многократном вводе и возврате назад можно обмануть это, чтобы потерять отслеживание текущей страницы. Это бесполезно при одновременном использовании dir-paginate и фильтрации. В моем случае, если я неоднократно набирал и удалял u, страница не синхронизировалась. - person Eric F.; 25.09.2015

Я столкнулся с этой же проблемой, но ответы здесь не соответствовали моим потребностям (или, может быть, желаниям). Я решил решить эту проблему самостоятельно и остановился на создании фильтра, единственной целью которого является запись элементов, проходящих через него, в заданном свойстве на заданной цели. Я придумал это:

/**
 * Author: Eric Ferreira <http://stackoverflow.com/users/2954747/eric-ferreira> ©2015
 *
 * This filter will sit in the filter sequence, and its sole purpose is to record 
 * the current contents to the given property on the target object. It is sort of
 * like the 'tee' command in *nix cli.
 */
angular.module('app').filter('record', function() {
    return function(array, property, target) {
        if (target && property) {
            target[property] = array;
        }
        return array;
    }
});

Затем вы используете фильтр в своей разбивке на страницы (или в любом другом месте, где вы хотите получить текущий массив на самом деле [подумайте, после фильтрации с помощью поискового запроса, после разбиения на страницы, после фильтрации текущей страницы и т. д.]) следующим образом:

<div dir-paginate="item in items | itemsPerPage:pageSize | record:'currentPage':this">{{item.text}}</div>

Вы также можете использовать его несколько раз в одной последовательности:

<div dir-paginate="item in items | filter:searchQuery | record:'filtered':this | itemsPerPage:pageSize | record:'currentPage':this">{{item.text}}</div>

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

Это запишет (и обновит при каждом изменении) текущую страницу в $scope.currentPage. this в приведенном выше примере является целью фильтра. Он разрешается в $scope.this, что для большинства намерений и целей равно просто $scope.

В вашем конкретном случае вы должны использовать эту строку (после добавления/требования фильтра в вашем модуле) вместо разбиения на страницы:

<li dir-paginate="meal in perman  = ( meals | filter:q ) | orderBy: order?'key':'-key' | itemsPerPage: pageSize | record:'currentPage':this">{{ meal.key + ': ' +meal.val }}</li>

Я пошел дальше и разветвил ваш плункер, чтобы показать, что он тоже работает:

http://plnkr.co/edit/uC3RiC?p=preview

person Eric F.    schedule 25.09.2015
comment
Как будет эта запись, если элемент не пропущен через фильтр? target как-то сбрасывается? - person pcnate; 17.08.2016
comment
Это сохраняет только те элементы, которые достигают его, поэтому он не будет сохранять ничего, отфильтрованного предыдущим фильтром. Если вы хотите сохранить список перед данным фильтром, просто поместите его перед другим фильтром в списке фильтров. - person Eric F.; 18.08.2016
comment
на самом деле я имел в виду тот факт, что фильтры будут часто обрабатывать. Просто взглянув на код, я бы подумал, что когда фильтры перезапускаются и находят меньше результатов, чем предыдущее выполнение, они не удаляют отсутствующие результаты, поэтому вы получите больше, чем вы думаете. видно. - person pcnate; 18.08.2016
comment
Ну, он не записывает постепенно; он стирает предыдущую ссылку каждый раз, когда вызывается. Таким образом, он никогда не выйдет из синхронизации с фактическими значениями. - person Eric F.; 18.08.2016
comment
Это отличная идея @EricF! - person Lulu; 21.12.2016

Да, мы можем создать собственную логику в соответствии с данными.

Displaying {{ pageSize * (currentPage-1)+$index+1 }} - {{ pageSize*currentPage }} of {{ perman.length }}
person Tanuj Kumar    schedule 17.09.2020

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

app.js

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.currentPage = 1;
  $scope.pageSize = 5;
  var meals = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

  function getPage(currentPage, pageSize, arr, reverse) {  
    var beginIndex, endIndex, noOfPages;

    if(reverse) {
       beginIndex = arr.length - currentPage * pageSize;  
    } else {
      beginIndex = currentPage * pageSize - pageSize;
    }

    endIndex = beginIndex + pageSize;
    beginIndex = beginIndex < 0 ? 0 : beginIndex;
    return arr.slice(beginIndex, endIndex);
  }

  //This will return the 5 elements in page 1 of meals array which will be meals 11 to 15 since the array is bound to the pagination directive in the reverse (desc) order
  $scope.firstFiveArrRev = getPage($scope.currentPage, $scope.pageSize, meals, true);

  //This will return the 5 elements in page 1 of meals array which will be meals 1 to 5 since the array is bound to the pagination directive in ascending order
  $scope.firstFiveArr = getPage($scope.currentPage, $scope.pageSize, meals, false);
});

index.html

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="[email protected]" src="https://code.angularjs.org/1.4.0-rc.0/angular.js" data-semver="1.4.0-rc.0"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    Displaying elements from page number {{currentPage}}
    <br />
    Page size is set to {{pageSize}}
    <br />
    When order is Reverse: true
    <div>{{ firstFiveArrRev.toString() }}</div>

    When order is Reverse: false
    <div>{{ firstFiveArr.toString() }}</div>
  </body>

</html>

Вот plnkr

http://plnkr.co/edit/CgH1WFR1JvOLmQsacVoI?p=preview

person Rathish Cholarajan    schedule 24.04.2015
comment
Спасибо за решение, у меня тоже было то же самое, но я хочу знать, есть ли какой-либо прямой способ получить текущие записи страниц в директиве dir-pagination. - person Samir Shah; 27.04.2015
comment
Это раздражает при использовании фильтра - person Eric F.; 25.09.2015

  1. Загрузите dirPagination.js отсюда.

  2. Теперь включите dirPagination.js на свою страницу.

  3. Добавьте angularUtils.directives.dirPagination в свой модуль следующим образом.

var app = angular.module("myApp",['angularUtils.directives.dirPagination']);
  1. Мы используем директиву dir-paginate для разбиения на страницы, добавляем dir-paginate в тег tr
<tr dir-paginate="event in events|orderBy:['columnid', 't']:true | itemsPerPage: 5">
  1. Добавьте приведенный ниже код в любом месте на вашей странице или в любом месте, где вы хотите.
<dir-pagination-controls
                max-size="5"
                direction-links="true"
                boundary-links="true" >
</dir-pagination-controls>
person Sahil Saini    schedule 19.04.2016