如何在Backbone.js集合请求中处理204响应

时间:2012-11-10 12:31:30

标签: jquery ajax backbone.js

在我的基于Backbone.js的应用程序中,我正在与我的API进行通信,它响应204状态和空体,以防请求集合但不包含任何数据。在我看来,RESTful API在这种情况下应该如何响应。

在我的应用程序中,我遇到了问题,显然在收到204响应后没有触发任何事件。我试图将resetall绑定为:

  FoosCollectionView.prototype.initialize = function() {
    this.collection = new FoosCollection;
    this.collection.bind('reset', this.render, this);
    this.collection.bind('all', this.render, this);
    return this.collection.fetch();
  };

但事件永远不会发生。所以我试着给fetch一些回调:

  FoosCollectionView.prototype.initialize = function() {
    this.collection = new FoosCollection();
    return this.collection.fetch({
      success: function(a, b, c) {
        debugger;
      },
      error: function(a, b, c) {
        debugger;
      },
      complete: function(a, b) {
        debugger;
      }
    });
  };

同样的行为。如果响应是204,则不会达到调试语句。如何处理204响应呢?我是否需要深入研究sync并为204添加额外的处理,或者Backbone中有什么东西我还不知道呢?

Thx Felix

3 个答案:

答案 0 :(得分:0)

解决方案似乎同时非常前瞻和尴尬:

我只是在我的集合中定义parse方法,以便检查传递的响应对象是否为空。这只是204发生的情况。然后在parse内设置this.collection.models = [],触发reset事件。集合视图绑定到该事件,运行一个可以查看this.collection.models内部的函数。如果没有给出模型,则可以呈现“无内容”模板而不是标准模板。

如果有人有更好的方法,我会很感激!

答案 1 :(得分:0)

Backbone.js将此类响应包装到空集合中。我使用它作为解决方法。

render: function(){
   if (this.collection.length == 0) {
       console.log('empty response');
       // initialize with default values
       this.collection.reset(data);
   }
   // do usual stuff
}

答案 2 :(得分:0)

今天也出现了同样的问题,从结论来看,我的代码错了。 修改代码后,当服务器以success()响应时,会调用204 No Content回调。

骨干:1.2.3
jQuery:2.1.4

代码错误:

FooCollection = Backbone.Collection.extend({
  url: '/foo',

  model: FooModel,

  fetch: function (options) {

    // do something.

    // Actually, you should call `Backbone.Collection.prototype.fetch()`.
    return Backbone.Model.prototype.fetch.call(this, options);
  }
});

因此,如果您遇到此问题,则应检查代码中是否有任何错误。 无论如何,如果你想处理204 No Content响应,有以下方法。 (不推荐)

  initialize: function() {
    this.collection = new FooCollection();

    var _this = this;
    this.collection.fetch({
      success: function (collection, response, options) {
      },
      error: function (collection, response, options) {
      }
    }).done(function (data, textStatus, jqXHR) {
      if (jqXHR.status === 204) {
        // do something.
        // e.g. _this.collection.reset();
      }
    });
  }