Angular - ngRepeat Order перед фильтром (нумерация страниц + порядок)

У меня есть ngRepeat ng-repeat="row in rows | orderBy:tableOrdering | filter:currentPage"

  • orderBy: tableOrdering вернет целые числа от 1 до 1000 и упорядочит таким образом.
  • filter: currentPage вернет первую страницу результатов из $scope.rows (bool)

Так как filter:currentPage всегда возвращает элементы из $scope.rows, который не упорядочен, будут упорядочены только результаты на этой (отфильтрованной) странице.

Есть ли способ запустить OrderBy FIRST, чтобы он отсортировал все строки, а затем отсортировал их по currentPage после сортировки?

ПРИМЕР КОДА: http://plnkr.co/edit/CamEiYIxyW5TaUPgmHxD

1 ответ

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

HTML

<tr ng-repeat="item in items | orderBy:tableOrdering  | filter:currentPage">

JS

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

app.controller('MainCtrl', function($scope) {
  $scope.name = 'Stackru';
  $scope.items = [
      {id : 1, value : 2},
      {id : 2, value : 6},
      {id : 3, value : 5},
      {id : 4, value : 1},
      {id : 5, value : 0},
      {id : 6, value : 6},
      {id : 7, value : 8},
      {id : 8, value : 4},
      {id : 9, value : 6},
      {id : 10, value : 3}
    ];

  $scope.pagination = {
        limit: 3, // ITems per page
        current: 0, // Current page (page - 1)
        asc: true, // Asc Vs Desc
        index: 0 // Count Variable for ordering/pagination
    };

    $scope.setPage = function(page) {
      $scope.pagination.current = page;
    }

    $scope.tableOrdering = function(item) {
        $scope.pagination.index = 0; // Resets index for counting
            if ($scope.pagination.asc) {
                return parseFloat(item.value);
            }
            else {
                return parseFloat(item.value) * (-1);
            }
    };

    $scope.currentPage = function(item) {
      for (var k = 0; k < $scope.items.length; k++) {
        if (item.id == $scope.items[k].id) {
          $scope.pagination.index++;
              if (  ($scope.pagination.limit * $scope.pagination.current)           <= $scope.pagination.index - 1 &&
                    ($scope.pagination.limit * ($scope.pagination.current + 1) - 1) >= $scope.pagination.index - 1) {

                 // On page
                 return true;
            }
            else {
              // Not on page
              return false;
            }
      }
      }

      // Fallback
      return false;
    };

});

Плункерная ссылка: http://plnkr.co/edit/sFvM9Nc65DPCwLy5lofE?p=preview

Другие вопросы по тегам