你是对的,创建你自己的Collection
是一条路,因为除了OData以外没有关于服务器分页的标准。
不是重写'fetch',我通常在这些情况下做的是创建一个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的集合来表示,因为使用了相同的参数/响应。
有没有办法像这样传递数据,而不是在获取调用内部进行?我记得之前在集合中定义了像这样的过滤字段,但不记得我是如何做到的。谢谢! – 2015-08-18 08:20:45