2012-02-14 5 views
3

私はバックボーンアプリケーションを作成しています。サーバーへのリクエストが行われると、ユーザーにフィードバックを提供する必要があります(迷惑なことですが、アプリケーションのこの動作を制御できません)。バックエンドは常にバックボーン同期要求の折り返し

{ 
    "status":"error", 
    "message":"something went really wrong" 
} 

または

{ 
    "status":"success", 
    "message":"congratulations", 
    "data":{...} 
} 

のように私は理解したいことは、メッセージングのいくつかの種類のためのフックを置く場所で、すべての応答で有益な(少なくとも理論的には)メッセージを報告しますサービス。

モデルとコレクションについては、可能性としてはparse()です。重複を避けるために、私はそれをいくつかのモデル基本クラスの中に入れなければならないでしょう。とにかくすべてのモデルとコレクションは自分自身でparse()を持っているので、まだ少し迷惑です。

より妥当な場所はBackbone.syncです。しかし、私はそれを上書きしたくないのですが、代わりに他のヘルパー関数の中にラップしたいと思います。ここで問題となるのは、すべてのリクエストで実行されるロジックを置くのに適したフックを見つけることができないということです。

リクエストごとに実行されるロジックを整理する方法についてご意見はありますか?

答えて

7

Backbone.sync以来戻っどんな$.ajax戻り、あなたが使用していると仮定すると、この

var originalMethod = Backbone.sync; 

Backbone.sync = function(method, model, options) { 
    var request = originalMethod.call(Backbone, method, model, options); 

    request.done(function(msg) { 
     console.log(msg); 
    }); 
    request.fail(function(jqXHR, textStatus) { 
     console.log(jqXHR, textStatus); 
    }); 
    return request; 
}; 
+3

代わりに、 'var request = originalMethod.apply(Backbone、arguments);'を実行することで、コードはAPIの変更を生き延びる良い機会になります。 –

3

のように、jQueryのデリゲートを使用して、私が欲しいものを達成するのは簡単です(> 1.5)同期からjqueryのすべての結果の最近の$.ajax約束を返します。 これを行うには、その約束を使って何かを同期して上書きしないでください。たとえば、あなたは(フェッチなかった場合)、あなたができる:もちろん

var p = mymodel.fetch(); 
p.done(function (res) { ... }); 
p.fail(function (err) { ... }); 

あなたはまた、オプションを取得するが、私は上記よりクリーン見つけるでコールバックを使用することができます。同じパターンがセーブやシンクを使用するものに適用されます。

+0

ありがとうございますが、これは本質的に私が既に自分自身に答えたものです。私が自分の答えで記述する方法を好むのは、あなたが示唆していることを実行すると、何十もの場所を意味するすべての要求に対してこの動作を追加する必要があるからです。 – Andrea

+0

それは私によってはうまくいく;)上記の利点は明確であるだけでなく、あなたが好きなフェッチを待つことができるという事実もある。たとえば、$ .when(p1、p2、p3).then(...ビューの初期化...);はるかにクリーンです。解析や同期のカスタマイズは、このimhoのための良い場所ではありません。 – ggozad

+0

実際、すべてのリクエストがすべてのフェッチを意味するわけではなく、すべてのセーブ、削除...すぐに乱雑になります。あなたの提案にはポイントがありますが、それは別のユースケースのためです:-) – Andrea

関連する問題