2012-06-20 6 views
5

Ho un server che funziona con un'intestazione ETag. Backbone si riferisce all'API per la prima volta: tutto è buono, la risposta ricevuta e analizzata. Seconda volta: il backbone invia al server ETag, in risposta riceve NotModified. E Backbone tenta di analizzare questa risposta, risultando in una raccolta chiamata reset.Backbone.js analizza la risposta non modificata

C'è un modo per aggirare la raccolta?

Il metodo di aggiunta dell'opzione da aggiungere nel metodo di recupero non funzionerà. Dal momento che ho bisogno di aggiornare completamente la raccolta, se sono arrivato alla risposta del server.

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

risposta

8

Per quanto posso dire, non esiste una soluzione facile per intrappolare una risposta 304. Quello che mi si avvicinò con:

  • parse riceve a second argument, options, che è possibile utilizzare per controllare lo stato della richiesta e ripopolare la tua collezione con gli stessi modelli, se necessario. Funziona, ma si attiverà una reset

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

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

  • jQuery accetta un'opzione ifModified che possono aiutare a

    ifModifiedpredefinito: false

    Consenti la richiesta per avere successo solo se la risposta è cambiata dall'ultima richiesta. Questo viene fatto controllando l'intestazione Last-Modified . Il valore predefinito è falso, ignorando l'intestazione. In jQuery 1.4 questa tecnica controlla anche il 'etag' specificato dal server per catturare i dati non modificati .

  • O ignorare l'fetch function di fermarsi su una risposta 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

La documentazione si è evoluta, il secondo parametro è [ora documentato] (http://backbonejs.org/#Collection-parse) ed è l'oggetto 'options' che conterrà' xhr'. La prima soluzione dovrebbe essere modificata in 'parse: function (response, options) { if (options.xhr.status === 304) return this.models return response.data; } ' – flochtililoch

+0

@flochtililoch Grazie per le informazioni, ho aggiornato la mia risposta – nikoshr

1

La risposta 304 non deve contenere un messaggio-corpo. Scusa, ho fretta di rispondere, le mie parole non aiutano qui.