2012-06-20 58 views
5

我有一個與標頭ETag一起工作的服務器。骨幹首次提到API:一切都很好,收到的響應和解析。第二次:骨幹發送到服務器ETag,作爲響應收到NotModified。而Backbone試圖解析這個響應,導致一個名爲reset的集合。Backbone.js解析未修改的響應

有什麼辦法可以重置集合嗎?

添加選項以添加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'), 
      } 
     }); 
    } 

回答

8

據我所知,沒有簡單的解決方案來捕獲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

    允許該請求只能成功如果自上次請求後響應已更改 。這是通過檢查最後修改 標題完成的。默認值爲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/

+1

文檔發展了,第二個參數是[現在記錄](http://backbonejs.org/#Collection-parse),並且是包含'xhr'的'options'對象。如果(options.xhr.status === 304) 返回this.models return result.data;如果(options.xhr.status === 304) 返回response.data,則需要將第一個解決方案更改爲'parse:function(response,options){ }' – flochtililoch

+0

@flochtililoch感謝您的信息,我更新了我的答案 – nikoshr

1

304響應必須不包含消息本體。 對不起,太急於回答,我的話在這裏沒有幫助。