2012-06-20 20 views
5

मेरे पास एक सर्वर है जो हेडर ETag के साथ काम करता है। बैकबोन पहली बार एपीआई को संदर्भित करता है: सबकुछ अच्छा है, प्रतिक्रिया प्राप्त हुई है और पार्स है। दूसरी बार: बैकबोन सर्वर ईटाग को भेजता है, प्रतिक्रिया में NotModified प्राप्त करता है। और बैकबोन इस प्रतिक्रिया को पार्स करने का प्रयास कर रहा है, जिसके परिणामस्वरूप रीसेट नामक एक संग्रह होता है।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 प्रतिक्रिया को फँसाने का कोई आसान समाधान नहीं है।

  • parsea second argument, options प्राप्त करता है, कि आप अनुरोध की स्थिति देखने और एक ही मॉडल के साथ अपने संग्रह फिर से आबाद यदि आवश्यक करने के लिए उपयोग कर सकते हैं: क्या मैं के साथ आया था। यह काम करता है, लेकिन यह एक 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डिफ़ॉल्ट स्वीकार करता है ट्रिगर किया जाएगा: झूठी

    की अनुमति दें केवल सफल होने का अनुरोध अगर अंतिम अनुरोध के बाद प्रतिक्रिया बदल गई है। यह अंतिम-संशोधित शीर्षलेख की जांच करके किया जाता है। हेडर को अनदेखा कर डिफ़ॉल्ट मान गलत है। 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.xhr.status === 304) इसे वापस लौटाएं। मॉडल वापसी प्रतिक्रिया.data; } ' – flochtililoch

+0

@flochtililoch जानकारी के लिए धन्यवाद, मैंने अपना जवाब अपडेट किया – nikoshr

1

304 प्रतिक्रिया संदेश-शरीर नहीं होनी चाहिए। क्षमा करें, बहुत जल्दी जवाब दे रहा था, मेरे शब्द यहां मदद नहीं करते हैं।