【问题标题】:How to handle a 204 response in a Backbone.js collection request如何处理 Backbone.js 收集请求中的 204 响应
【发布时间】:2012-11-10 12:31:30
【问题描述】:

在我的基于 Backbone.js 的应用程序中,我正在与我的 API 交谈,该 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 中是否有一些我根本不知道的东西?

谢谢菲利克斯

【问题讨论】:

  • 据我所知,我可以在集合解析方法中添加一些登录信息。但是从那里处理“无内容”视图的渲染似乎很难看。
  • 我找到了一个看起来至少更优雅一点的解决方案。我在我的收藏中定义了 parse 。在里面我检查给定的响应是否为空。如果是这样,我将集合模型设置为 [] 从而触发重置事件。集合视图绑定到该事件,然后可以呈现一些“这里没有内容”模板。

标签: jquery ajax backbone.js


【解决方案1】:

这个解决方案看起来很先进但同时也很尴尬:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      今天也出现了同样的问题,从结论上说,我的代码是错误的。 修改代码后,当服务端回复204 No Content时调用success()回调。

      主干: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();
            }
          });
        }
      

      【讨论】:

        猜你喜欢
        • 2015-07-23
        • 1970-01-01
        • 2021-12-02
        • 2018-10-07
        • 2020-04-25
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        • 2016-12-27
        相关资源
        最近更新 更多