【问题标题】:Backbone.js parse not-modified responseBackbone.js 解析未修改的响应
【发布时间】:2012-06-22 06:27:36
【问题描述】:

我有一个使用标头 ETag 的服务器。 Backbone 首次引用 API:一切正常,响应接收并解析。第二次:主干向服务器发送 ETag,作为响应收到 NotModified。并且 Backbone 试图解析这个响应,从而产生一个名为 reset 的集合。

有什么办法可以重置集合吗?

在 fetch 方法中添加选项添加的方法不起作用。由于我需要完全刷新集合,如果我来了服务器的响应。

var recommendCollection = Backbone.Collection.extend({
    model : Event,
    etag : null,
    urlRoot : '/api/users',
    initialize: function() {
        this.etag = null;
    },
    parse: function(response) {
        return response.data;
    },      
    url : function () {
        return (this.urlRoot + "/"+window.me.get('id')+ "/recommendation");
    },
    beforeSend : function (jqXHR, settings) {
        jqXHR.setRequestHeader('if-none-match', this.etag);
    },
    complete : function (jqXHR, textStatus) {
        if (jqXHR.status == 200 || jqXHR.status == 304) {
            this.etag = jqXHR.getResponseHeader('ETag');
        }
    },
    update : function () {
        this.fetch({
            beforeSend : this.beforeSend.bind(this),
            complete : this.complete.bind(this),
            data : {
                cityId : window.me.get('cityId'),
            }
        });
    }

【问题讨论】:

    标签: javascript caching jquery backbone.js etag


    【解决方案1】:

    据我所知,没有简单的解决方案来捕获 304 响应。我想出了什么:

    • parse 接收 a second argumentoptions,您可以使用它们来检查请求的状态,并在必要时使用相同的模型重新填充您的集合。它有效,但会触发reset

      parse: function(response, options) {
          if (options.xhr.status === 304)
              return this.models
      
          return response.data;
      }
      

      http://jsfiddle.net/nikoshr/sxv9P/12/

    • jQuery 接受一个ifModified 选项,这可能会对你有所帮助

      ifModified 默认值:false

      仅当响应发生变化时才允许请求成功 自上次请求以来。这是通过检查 Last-Modified 标题。默认值为 false,忽略标题。在 jQuery 1.4 中 此技术还检查服务器指定的“etag”以捕获 未修改的数据。

    • 或覆盖 fetch function 以停止 304 响应

      fetch: function(options) {
            options = options ? _.clone(options) : {};
            if (options.parse === undefined) options.parse = true;
            var collection = this;
            var success = options.success;
            options.success = function(resp, status, xhr) {
              if (xhr.status!==304)
                  collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);
              if (success) success(collection, resp);
            };
            options.error = Backbone.wrapError(options.error, collection, options);
            return (this.sync || Backbone.sync).call(this, 'read', this, options);
      }
      

      http://jsfiddle.net/sxv9P/1/

    【讨论】:

    • 文档演变,第二个参数是now documented,是options对象,将包含xhr。第一个解决方案需要更改为parse: function(response, options) { if (options.xhr.status === 304) return this.models return response.data; }
    • @flochtililoch 感谢您的信息,我更新了我的答案
    【解决方案2】:

    304 响应不得包含消息正文。 抱歉,太着急回答了,我的话在这里没有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 2018-08-03
      • 2018-09-02
      • 1970-01-01
      • 2015-06-30
      • 2012-02-21
      相关资源
      最近更新 更多