2012-11-10 22 views
5

W mojej aplikacji opartej na Backbone.js mówię do mojego interfejsu API, który odpowiada statusem 204 i pustym obiektem, na wypadek, gdyby żądano kolekcji, która nie zawiera jeszcze żadnych danych. To jest w mojej opinii, jak RESTful API powinien odpowiedzieć w takim przypadku.Jak obsłużyć odpowiedź 204 w żądaniu kolekcji Backbone.js

W mojej aplikacji mam teraz problem, że oczywiście żadne zdarzenie nie jest wyzwalane po otrzymaniu odpowiedzi 204. Starałem się wiązać reset i all jak:

FoosCollectionView.prototype.initialize = function() { 
    this.collection = new FoosCollection; 
    this.collection.bind('reset', this.render, this); 
    this.collection.bind('all', this.render, this); 
    return this.collection.fetch(); 
    }; 

ale wydarzenia nigdy ogień. Próbowałem więc podać kilka wywołań zwrotnych:

FoosCollectionView.prototype.initialize = function() { 
    this.collection = new FoosCollection(); 
    return this.collection.fetch({ 
     success: function(a, b, c) { 
     debugger; 
     }, 
     error: function(a, b, c) { 
     debugger; 
     }, 
     complete: function(a, b) { 
     debugger; 
     } 
    }); 
    }; 

To samo zachowanie. Żadna instrukcja debugowania nie zostanie osiągnięta w przypadku odpowiedzi 204. Jak mogę obsłużyć 204 odpowiedzi? Czy będę musiał zagłębić się w sync i dodać dodatkową obsługę dla 204 tam, czy jest coś w Kręgosłupie, którego po prostu jeszcze nie wiem?

Thx Felix

+0

O ile dowiedziałem się, mogę dodać trochę logowanie do zbiorów analizować metody. Lecz obsługa renderowania widoku "bez treści" wydaje się brzydka. – GeorgieF

+2

Znalazłem rozwiązanie, które wydaje się co najmniej trochę bardziej eleganckie. Definiuję parsowanie w moich zbiorach. Wewnątrz sprawdzam, czy dana odpowiedź jest pusta. Jeśli tak, ustawiam modele kolekcji na [], które z kolei wyzwalają zdarzenie resetowania. Widok kolekcji jest powiązany z tym zdarzeniem i może następnie renderować szablon "brak zawartości tutaj". – GeorgieF

Odpowiedz

0

Rozwiązaniem wydaje się całkiem do przodu i niewygodne w tym samym czasie:

po prostu zdefiniować metodę w moich zbiorach parse tak, że sprawdza, czy obiekt przeszedł odpowiedź jest pusty. Tak jest tylko w przypadku 204. Następnie wewnątrz parse ustawiam this.collection.models = [], który wyzwala zdarzenie reset. Widok kolekcji jest powiązany z tym zdarzeniem, uruchamia funkcję, która może wyglądać wewnątrz: this.collection.models. W przypadku braku modeli, szablon standardowy może być renderowany jako szablon "bez zawartości".

Jeśli ktoś ma lepsze podejście, byłbym wdzięczny, że tutaj!

0

Backbone.js opakowuje takie odpowiedzi w pustą kolekcję. Używam tego jako obejścia.

render: function(){ 
    if (this.collection.length == 0) { 
     console.log('empty response'); 
     // initialize with default values 
     this.collection.reset(data); 
    } 
    // do usual stuff 
} 
0

Ten sam problem wystąpił dzisiaj i od samego początku podałem, że mój kod był błędny. Po modyfikacji kodu zadzwoniono pod numer success(), gdy serwer odpowie 204 No Content.

Backbone: 1.2.3
jQuery: 2.1.4

Niewłaściwy kod:

FooCollection = Backbone.Collection.extend({ 
    url: '/foo', 

    model: FooModel, 

    fetch: function (options) { 

    // do something. 

    // Actually, you should call `Backbone.Collection.prototype.fetch()`. 
    return Backbone.Model.prototype.fetch.call(this, options); 
    } 
}); 

Tak więc, jeśli wystąpi ten problem, należy sprawdzić, czy jest jakiś błąd w kod. W każdym razie, jeśli chcesz obsłużyć odpowiedź 204 No Content, istnieje następująca metoda. (nie zalecane)

initialize: function() { 
    this.collection = new FooCollection(); 

    var _this = this; 
    this.collection.fetch({ 
     success: function (collection, response, options) { 
     }, 
     error: function (collection, response, options) { 
     } 
    }).done(function (data, textStatus, jqXHR) { 
     if (jqXHR.status === 204) { 
     // do something. 
     // e.g. _this.collection.reset(); 
     } 
    }); 
    } 
Powiązane problemy