Web services 如何在服务器上筛选主干集合
在服务器上过滤集合的服务中是否有一种通用模式?我在Google和Stack Overflow搜索中找不到任何东西,考虑到生产中的主干应用程序数量,这令人惊讶Web services 如何在服务器上筛选主干集合,web-services,backbone.js,collections,filtering,Web Services,Backbone.js,Collections,Filtering,在服务器上过滤集合的服务中是否有一种通用模式?我在Google和Stack Overflow搜索中找不到任何东西,考虑到生产中的主干应用程序数量,这令人惊讶 假设我正在使用主干网为堆栈溢出构建一个新的前端 在搜索屏幕上,我需要将以下信息传递给服务器,并返回一页的结果 过滤标准 排序标准 每页结果 页码 主干网似乎对将过滤卸载到服务器上没有多大兴趣。它期望服务器返回整个问题列表,并在客户端执行过滤 我猜为了完成这项工作,我需要对该方法进行子类化和重写,这样它就可以传递上述参数,而不是总是从同
假设我正在使用主干网为堆栈溢出构建一个新的前端 在搜索屏幕上,我需要将以下信息传递给服务器,并返回一页的结果
- 过滤标准
- 排序标准
- 每页结果
- 页码
我不想重新发明轮子。我是否缺少主干网中的一项功能,该功能将使此过程更简单或与现有组件更兼容?是否已经有一个完善的模式来解决此问题?如果您只想在请求中传递GET参数,您应该能够在fetch调用本身中指定它们
collection.fetch( {
data: {
sortDir: "ASC",
totalResults: 100
}
} );
传入fetch的选项应该直接转换为调用,并且应该自动解析数据属性。当然,重写fetch方法也很好,特别是如果您想要标准化部分逻辑 你说得对,创建自己的
集合
是一条路,因为除了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的扩展。如果您需要添加自己的初始化
,请像这样调用父级的原型,否则您将不会解析头:
PagedCollection.prototype.initialize.apply(此参数)
您甚至可以将fetchNext
和fetchPrevious
方法添加到集合中,只需修改this.currentPage
和fetch
。如果要将一页替换为另一页而不是追加,请记住将{reset:true}
添加为fetch
选项
现在,如果您的项目后端是一致的,那么只要使用相同的参数/响应,允许在服务器上分页的任何资源都可以在客户端上使用一个基于PagedCollection的集合来表示。有没有一种方法可以像这样传递数据,而不必在fetch调用内部执行?我记得以前在集合中定义过这样的过滤器字段,但不记得是怎么定义的。谢谢