Javascript Backbone.js解析未修改响应

Javascript Backbone.js解析未修改响应,javascript,caching,jquery,backbone.js,etag,Javascript,Caching,Jquery,Backbone.js,Etag,我有一个与头ETag一起工作的服务器。主干是指API的第一次:一切都很好,收到的响应和解析。第二次:主干发送到服务器ETag,响应接收NotModified。主干试图解析这个响应,结果产生了一个称为reset的集合 有没有办法重置集合 在fetch方法中添加要添加的选项的方法将不起作用。因为我需要完全刷新集合,如果我访问服务器的响应 var recommendCollection = Backbone.Collection.extend({ model : Event, etag

我有一个与头ETag一起工作的服务器。主干是指API的第一次:一切都很好,收到的响应和解析。第二次:主干发送到服务器ETag,响应接收NotModified。主干试图解析这个响应,结果产生了一个称为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'),
            }
        });
    }

据我所知,没有简单的解决方案可以捕获304响应。我想到的是:

  • 解析
    接收,
    选项
    ,您可以使用该选项检查请求的状态,并在必要时使用相同的模型重新填充您的收藏。它可以工作,但会触发
    重置

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

  • jQuery接受一个
    ifModified
    选项,该选项可能对您有所帮助

    如果修改默认值:false

    仅当响应已更改时才允许请求成功 自从上次请求以来。这是通过检查上次修改的 标题。默认值为false,忽略标题。在jQuery1.4中 此技术还检查服务器指定的要捕获的“etag” 未修改的数据

  • 或在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);
    }
    


304响应不得包含消息正文。
很抱歉,我回答得太匆忙了,我的话在这里没有帮助。

文档不断发展,第二个参数是,并且是将包含
xhr
options
对象。第一个解决方案需要更改为
parse:function(response,options){if(options.xhr.status==304)returnthis.models return response.data;}
@flochtilliloch谢谢您提供的信息,我更新了我的答案