2012-11-10 10 views
5

私のBackbone.jsベースのアプリケーションでは、204ステータスと空のボディで応答する私のAPIと話しています。データはまだありません。そのような場合に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の余分な処理を加えなければならないのでしょうか、それとも私がまだ分かっていないものがバックボーンにありますか?

ソリューションは、同時にかなり前方と厄介なようだThxをフェリックス

+0

。しかし、そこからの「コンテンツなし」ビューのレンダリングを扱うことは醜いようです。 – GeorgieF

+2

少なくとももう少しエレガントな解決策を見つけました。私は自分のコレクションに解析を定義します。内部私は、指定された応答が空であるかどうかをチェックします。もしそうなら、私はコレクションモデルを[]にセットし、リセットイベントをトリガーします。コレクションビューはそのイベントにバインドされ、その後、「ここにはコンテンツがありません」というテンプレートがレンダリングされます。 – GeorgieF

答えて

0

:それは渡されたレスポンスオブジェクトが空であるかどうか、チェックするように

が、私は単に私のコレクションにparseメソッドを定義します。それは、204が発生したときだけです。その後、parsethis.collection.models = []と設定して、resetイベントを発生させます。コレクションビューは、そのイベントにバインドされ、内部に外観を持つことができる関数を実行しますthis.collection.models。モデルが与えられていない場合は、標準テンプレートの代わりに「no-content」テンプレートをレンダリングすることができます。

誰かがより良いアプローチをしているなら、私はここに感謝します!

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(); 
     } 
    }); 
    } 
関連する問題