2012-06-20 10 views
5

Tengo un servidor que funciona con un encabezado ETag. Backbone se refiere a la API por primera vez: todo está bien, la respuesta recibida y el análisis. Segunda vez: la red troncal envía al servidor ETag, en respuesta recibe NotModified. Y Backbone tratando de analizar esta respuesta, lo que resulta en una colección llamada reinicio.Backbone.js parse respuesta no modificada

¿Hay alguna forma de restablecer la colección?

El método de agregar la opción para agregar en el método de búsqueda no funcionará. Ya que necesito actualizar completamente la colección, si llegué a la respuesta del servidor.

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

Respuesta

8

Por lo que puedo ver, no hay una solución fácil para atrapar una respuesta 304. Lo que ocurrió:

  • parse recibe a second argument, options, que se puede utilizar para comprobar el estado de la solicitud y repoblar su colección con los mismos modelos si es necesario. Funciona, pero dará lugar a una reset

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

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

  • jQuery acepta una opción ifModified que pueden ayudarle a

    ifModifiedpor defecto: false

    Permitir la solicitud de tener éxito solo si la respuesta ha cambiado desde la última solicitud. Esto se hace al marcar el encabezado Last-Modified . El valor predeterminado es falso, ignorando el encabezado. En jQuery 1.4 esta técnica también comprueba el 'etag' especificado por el servidor para capturar datos no modificados.

  • o anular los fetch function que parar en una respuesta 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 documentación evolucionó, el segundo parámetro está [ahora documentado] (http://backbonejs.org/#Collection-parse), y es el objeto 'options' que contendrá el' xhr'. La primera solución debería cambiarse a 'analizar: función (respuesta, opciones) { if (opciones.xhr.status === 304) devolver this.models return response.data; } ' – flochtililoch

+0

@flochtililoch Gracias por la información, actualicé mi respuesta – nikoshr

1

La respuesta 304 no debe contener un mensaje de cuerpo. Lo siento, estaba demasiado apurado para responder, mis palabras no ayudan aquí.