Вы правы, создание вашего собственного Collection
- это путь, так как нет стандартов о разбиении страниц на страницы, кроме OData.
Вместо того, чтобы переопределять «выборку», то, что я обычно делаю в этих случаях, создает свойство collection.url
как функцию, возвращает правильный URL на основе состояния коллекции.
Для того, чтобы сделать разбиение на страницы, сервер должен вернуть вам общее количество элементов, чтобы вы могли рассчитать, сколько страниц основано на элементах X на странице. В настоящее время некоторые API-интерфейсы используют такие вещи, как HAL или HATEOAS, которые в основном являются заголовками ответов HTTP. Чтобы получить эту информацию, я обычно добавляю слушателя к событию sync
, которое возникает после любой операции AJAX. Если вам необходимо уведомить внешние компоненты (как правило, представление) о числе доступных элементов/страниц, используйте событие.
Простой пример: ваш сервер возвращает X-ItemTotalCount
в заголовках ответов и ожидает, что в запросе будут запрашиваться параметры page
и items
.
var PagedCollection = Backbone.Collection.extend({
initialize: function(models,options){
this.listenTo(this, "sync", this._parseHeaders);
this.currentPage = 0;
this.pageSize = 10;
this.itemCount = 0;
},
url: function() {
return this.baseUrl + "?page=" + this.currentPage + "&items=" + this.pageSize;
},
_parseHeaders: function(collection,response){
var totalItems = response.xhr.getResponseHeader("X-ItemTotalCount");
if(totalItems){
this.itemCount = parseInt(totalItems);
//trigger an event with arguments (collection, totalItems)
this.trigger("pages:itemcount", this, this.itemCount);
}
}
});
var PostCollection = PagedCollection.extend({
baseUrl: "/posts"
});
Заметьте, что мы используем другую собственность, baseUrl
упростить расширение PagedCollection. Если вам нужно добавить свой собственный initialize
, вызовите родителя прототип один такой, или вы не разбирает заголовки:
PagedCollection.protoype.initialize.apply(this,arguments)
Вы даже можете добавить fetchNext
и fetchPrevious
методы сбора, где вы просто изменить this.currentPage
и fetch
. Не забудьте добавить {reset:true}
как fetch
, если вы хотите заменить одну страницу другой, а не добавлять.
Теперь, если ваш сервер для проекта согласован, любой ресурс, который позволяет разбивать страницы на сервер, может быть представлен с использованием одной коллекции на основе PagedCollection на клиенте, учитывая те же параметры/ответы.
Есть ли способ передавать данные, подобные этому, не делая внутри вызова выборки? Я помню, что раньше были такие поля фильтров, которые были определены в самой коллекции, но не могу вспомнить, как я это сделал. Благодаря! –