2012-06-20 9 views
5

Ich habe einen Server, der mit einem Header ETag arbeitet. Backbone bezieht sich zum ersten Mal auf die API: Alles ist gut, die Antwort wird empfangen und parsen. Zweites Mal: ​​Backbone sendet an den Server ETag, als Antwort erhält NotModified. Und Backbone versucht, diese Antwort zu analysieren, was zu einer Sammlung namens reset führt.Backbone.js analysieren nicht modifizierte Antwort

Gibt es einen Weg um die Sammlung zurückzusetzen?

Die Methode zum Hinzufügen der Option zum Hinzufügen in der Abrufmethode funktioniert nicht. Da muss ich die Sammlung komplett auffrischen, wenn ich auf die Antwort des Servers komme.

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

Antwort

8

Soweit ich sagen kann, gibt es keine einfache Lösung, eine 304 Antwort zu fangen. Was ich kam mit:

  • parse erhält a second argument, options, dass Sie den Status des Antrags zu überprüfen, verwenden können und Ihre Sammlung mit den gleichen Modellen bei Bedarf neu zu besiedeln. Es funktioniert, aber es wird ein reset

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

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

  • jQuery nimmt eine ifModified Option auslösen, die Sie

    ifModifiedStandard helfen kann: false

    zulassen die Anforderung, nur erfolgreich zu sein wenn die Antwort seit der letzten Anfrage geändert hat. Dies wird durch Überprüfen des zuletzt geänderten Headers erreicht. Der Standardwert ist false und ignoriert den Header. In jQuery 1.4 überprüft diese Technik auch das vom Server angegebene 'Etag', um unveränderte Daten abzufangen.

  • Oder die fetch function außer Kraft setzen auf eine 304-Antwort

    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

Die Dokumentation entwickelte sich, der zweite Parameter ist [jetzt dokumentiert] (http://backbonejs.org/#Collection-parse) und ist das 'options'-Objekt, das' xhr' enthält. Die erste Lösung müsste geändert werden in 'Parse: Funktion (Antwort, Optionen) { if (options.xhr.status === 304) Rückgabe this.models return response.data; } ' – flochtililoch

+0

@flochtililoch Danke für die Info, habe ich meine Antwort aktualisiert – nikoshr

1

Die 304 Antwort eine Nachricht Körper enthalten darf nicht zu stoppen. Sorry, war zu schnell zu beantworten, meine Worte helfen hier nicht.

Verwandte Themen