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