Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services 如何在服务器上筛选主干集合_Web Services_Backbone.js_Collections_Filtering - Fatal编程技术网

Web services 如何在服务器上筛选主干集合

Web services 如何在服务器上筛选主干集合,web-services,backbone.js,collections,filtering,Web Services,Backbone.js,Collections,Filtering,在服务器上过滤集合的服务中是否有一种通用模式?我在Google和Stack Overflow搜索中找不到任何东西,考虑到生产中的主干应用程序数量,这令人惊讶 假设我正在使用主干网为堆栈溢出构建一个新的前端 在搜索屏幕上,我需要将以下信息传递给服务器,并返回一页的结果 过滤标准 排序标准 每页结果 页码 主干网似乎对将过滤卸载到服务器上没有多大兴趣。它期望服务器返回整个问题列表,并在客户端执行过滤 我猜为了完成这项工作,我需要对该方法进行子类化和重写,这样它就可以传递上述参数,而不是总是从同

在服务器上过滤集合的服务中是否有一种通用模式?我在Google和Stack Overflow搜索中找不到任何东西,考虑到生产中的主干应用程序数量,这令人惊讶


假设我正在使用主干网为堆栈溢出构建一个新的前端

在搜索屏幕上,我需要将以下信息传递给服务器,并返回一页的结果

  • 过滤标准
  • 排序标准
  • 每页结果
  • 页码
主干网似乎对将过滤卸载到服务器上没有多大兴趣。它期望服务器返回整个问题列表,并在客户端执行过滤

我猜为了完成这项工作,我需要对该方法进行子类化和重写,这样它就可以传递上述参数,而不是总是从同一个RESTful URL获取数据


我不想重新发明轮子。我是否缺少主干网中的一项功能,该功能将使此过程更简单或与现有组件更兼容?是否已经有一个完善的模式来解决此问题?

如果您只想在请求中传递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调用内部执行?我记得以前在集合中定义过这样的过滤器字段,但不记得是怎么定义的。谢谢