2012-06-20 28 views
5

Tôi có một máy chủ hoạt động với thẻ ETAG tiêu đề. Xương sống đề cập đến API lần đầu tiên: mọi thứ đều tốt, phản hồi nhận được và phân tích cú pháp. Thứ hai thời gian: xương sống gửi đến máy chủ ETag, trong phản ứng nhận NotModified. Và Backbone cố gắng phân tích cú pháp phản hồi này, dẫn đến một bộ sưu tập có tên là reset.Phản hồi không được sửa đổi phân tích cú pháp Backbone.js

Có cách nào xung quanh nó đặt lại bộ sưu tập không?

Phương pháp thêm tùy chọn thêm vào phương thức tìm nạp sẽ không hoạt động. Vì tôi cần hoàn toàn làm mới bộ sưu tập, nếu tôi đến phản hồi của máy chủ.

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'), 
      } 
     }); 
    } 

Trả lời

8

Theo như tôi có thể nói, không có giải pháp dễ dàng nào để thu hồi phản hồi 304. Những gì tôi đã đưa ra:

  • parse nhận a second argument, options, mà bạn có thể sử dụng để kiểm tra tình trạng của các yêu cầu và phục hồi lại bộ sưu tập của bạn với các mô hình tương tự nếu cần thiết. Nó hoạt động, nhưng nó sẽ kích hoạt một reset

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

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

  • jQuery chấp nhận một tùy chọn ifModified có thể giúp bạn

    ifModifiedMặc định: false

    phép yêu cầu chỉ thành công nếu câu trả lời đã thay đổi kể từ lần yêu cầu cuối cùng. Điều này được thực hiện bằng cách kiểm tra tiêu đề được sửa đổi lần cuối. Giá trị mặc định là sai, bỏ qua tiêu đề. Trong jQuery 1.4 , kỹ thuật này cũng kiểm tra 'etag' được chỉ định bởi máy chủ để thu thập dữ liệu chưa sửa đổi .

  • Hoặc ghi đè fetch function dừng lại trên một phản ứng 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

Tài liệu được phát triển, tham số thứ hai là [nay được ghi lại] (http://backbonejs.org/#Collection-parse) và là đối tượng 'tùy chọn' chứa' xhr'. Giải pháp đầu tiên sẽ cần phải được thay đổi thành 'phân tích cú pháp: chức năng (phản hồi, tùy chọn) { nếu (tùy chọn.xhr.status === 304) trả lại.mô hình này return response.data; } ' – flochtililoch

+0

@flochtililoch Cảm ơn thông tin, tôi đã cập nhật câu trả lời của mình – nikoshr

1

Câu trả lời 304 PHẢI KHÔNG chứa một thông điệp cơ thể. Xin lỗi, đã quá vội vàng trả lời, lời nói của tôi không giúp ích gì ở đây.

Các vấn đề liên quan