Backbone.Paginator — это расширение для Backbone.js, предназначенное для удобного управления пагинацией и постраничной загрузкой данных. Он облегчает работу с коллекциями, позволяя разделять их на страницы, управлять состоянием текущей страницы и интегрировать серверные и клиентские методы получения данных. Основное преимущество Backbone.Paginator — абстракция логики пагинации, что позволяет сосредоточиться на работе с данными и интерфейсом.
Backbone.Paginator предоставляет два основных типа коллекций для работы с постраничными данными:
ClientPager Коллекция для постраничного отображения данных, которые уже загружены на клиент. Все элементы загружаются сразу, а отображение делается по страницам локально. Основные свойства:
currentPage — текущая страница.perPage — количество элементов на странице.totalRecords — общее количество элементов.totalPages() — метод для вычисления общего числа
страниц.Пример конфигурации ClientPager:
var MyClientCollection = Backbone.Paginator.requestPager.extend({
model: MyModel,
paginator_core: {
type: 'GET',
dataType: 'json',
url: '/data'
},
paginator_ui: {
firstPage: 1,
currentPage: 1,
perPage: 10,
totalRecords: 100
},
server_api: {},
parse: function(response) {
return response.items;
}
});ServerPager Коллекция для постраничного отображения данных с сервера. Данные загружаются по мере необходимости, запрашивая только нужную страницу. ServerPager особенно полезен при работе с большими наборами данных. Ключевые свойства:
currentPage — текущая страница.perPage — количество элементов на странице.totalRecords — получаемое от сервера количество
записей.server_api — объект, описывающий параметры запроса к
серверу (например, page, per_page).Пример конфигурации ServerPager:
var MyServerCollection = Backbone.Paginator.requestPager.extend({
model: MyModel,
paginator_core: {
type: 'GET',
dataType: 'json',
url: '/api/items'
},
paginator_ui: {
firstPage: 1,
currentPage: 1,
perPage: 20
},
server_api: {
'page': function() { return this.currentPage; },
'per_page': function() { return this.perPage; }
},
parse: function(response) {
this.totalRecords = response.total;
return response.items;
}
});Backbone.Paginator предоставляет методы для управления текущей страницей и навигацией:
getFirstPage() — перейти на первую страницу.getPreviousPage() — перейти на предыдущую
страницу.getNextPage() — перейти на следующую страницу.getLastPage() — перейти на последнюю страницу.goTo(page) — перейти на указанную страницу.Пример использования методов навигации:
collection.getNextPage(); // загружает следующую страницу
collection.goTo(5); // загружает пятую страницу
server_api позволяет динамически задавать параметры
запроса для серверной пагинации. Каждый параметр может быть функцией,
которая возвращает текущее значение. Это удобно для фильтрации и
сортировки данных.
Пример с фильтром:
var FilteredCollection = Backbone.Paginator.requestPager.extend({
model: MyModel,
paginator_core: {
type: 'GET',
dataType: 'json',
url: '/api/items'
},
paginator_ui: {
firstPage: 1,
currentPage: 1,
perPage: 10
},
server_api: {
'page': function() { return this.currentPage; },
'per_page': function() { return this.perPage; },
'category': function() { return this.categoryFilter; }
},
parse: function(response) {
this.totalRecords = response.total;
return response.items;
}
});
Здесь параметр category автоматически подставляется в
запрос в зависимости от текущего значения фильтра.
Backbone.Paginator расширяет стандартные методы Backbone.Collection и добавляет события для отслеживания изменений пагинации:
События:
pageChange — срабатывает при смене страницы.reset — срабатывает после загрузки новой страницы (как
стандартное событие коллекции).Методы:
hasNextPage() — проверяет, есть ли следующая
страница.hasPreviousPage() — проверяет, есть ли предыдущая
страница.totalPages() — возвращает количество страниц.toJSON() — возвращает данные текущей страницы.Пример обработки события смены страницы:
collection.on('pageChange', function() {
console.log('Текущая страница:', collection.currentPage);
});
Backbone.Paginator хорошо интегрируется с Backbone.View. Для
динамической отрисовки элементов коллекции достаточно подписаться на
события reset и обновлять DOM.
Пример простого представления с навигацией:
var ItemsView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.collection, 'reset', this.render);
},
render: function() {
this.$el.empty();
this.collection.each(function(model) {
this.$el.append('<li>' + model.get('name') + '</li>');
}, this);
return this;
}
});
var collection = new MyServerCollection();
var view = new ItemsView({ collection: collection, el: '#items-list' });
collection.getFirstPage();
Для создания интерфейса пагинации можно добавить кнопки «Следующая» и
«Предыдущая», связывая их с методами getNextPage() и
getPreviousPage().
Backbone.Paginator позволяет реализовать дополнительные возможности:
server_api с
динамическими значениями.Backbone.Paginator обеспечивает гибкую и масштабируемую структуру для постраничного управления данными, сохраняя при этом совместимость с привычными коллекциями Backbone.