2012-11-10 60 views
5

在我的基於Backbone.js的應用程序中,我正在與我的API進行通信,該應用程序以204狀態和空體響應,以防收集請求中不包含任何數據呢。在我看來,RESTful API在這種情況下應該如何迴應。如何處理Backbone.js收集請求中的204響應

在我的應用程序現在我有這個問題,顯然沒有收到204響應後觸發事件。我試圖綁定resetall,如:

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(); 
    }; 

但事件永遠不會觸發。所以我試圖提供一些回調:

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

相同的行爲。在響應是204的情況下,沒有任何調試語句可以達到。那麼我怎樣才能處理204個響應呢?我將不得不深入研究sync,併爲204添加額外的處理,或者在Backbone中有一些我根本不知道的東西?

THX菲利克斯

+0

至於我發現,在集合分析方法我可以添加一些登錄。但處理從那裏渲染「無內容」視圖看起來很難看。 – GeorgieF

+2

我發現了一個似乎至少稍微優雅一點的解決方案。我在我的集​​閤中定義瞭解析。在內部我檢查給定的響應是否爲空。如果是這樣,我將集合模型設置爲[],然後觸發重置事件。集合視圖綁定到該事件,然後可以渲染一些「無內容」模板。 – GeorgieF

回答

0

的解決方案似乎很正向和尷尬在同一時間:

我簡單地定義在我的藏品parse方法,以便它會檢查,傳遞響應對象是否爲空。當204發生時,情況就是如此。然後在parse裏面我設置了this.collection.models = [],這觸發了一個reset事件。集合視圖綁定到該事件,運行一個函數,可以看看this.collection.models。如果沒有給出模型,可以使用「無內容」模板來代替標準模板。

如果有人有更好的方法,我會很高興在這裏!

0

Backbone.js將這樣的響應包裝到空集合中。我正在使用這個解決方法。

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

今天發生了同樣的問題,並從結論中說,我的代碼是錯誤的。 修改代碼後,當服務器以204 No Content響應時調用success()回調。

骨幹:1.2.3
jQuery的:2.1.4

錯誤代碼:

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

因此,如果您遇到這個問題,你應該檢查是否有任何錯誤的碼。 無論如何,如果你想處理204 No Content響應,有以下方法。 (不推薦)

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(); 
     } 
    }); 
    }