2

backbone.js を使用してアプリを構築しています。backbone.js がサーバーに http 要求を行っているときに、グローバルな読み込み効果を追加したいと考えています。これは単一ページの webapp であるため、非同期の http 要求がたくさんあります。これを簡単にするために Backbone.sync メソッドを変更できると思います。これどうやってするの?

コードのサンプルを投稿する

// let's say there is a function to generate the loading and remove it
// mask.create();
// mask.remove();
var BookList = Backbone.Collection.extend({
    model:Book,
    url:'/api/list/1',
});

    var list = new BookList();

list.bind('reset', function(){
    $('.content').html('');
    list.each(function(book){
        self.addOne(book);
    })  
});
    list.fetch();
4

2 に答える 2

3

UIフィードバックのためにディスプレイを同期に接続しようとしているようです。ただし、懸念を混乱させたくないので、同期自体がプレゼンテーションを気にしたくありません。デフォルトの同期の実装では、いくつかのイベントが提供されます (ドキュメントでさらに詳しく説明されている可能性があります)。

モデルまたはコレクションがサーバーとの同期を開始するたびに、「リクエスト」イベントが発行されます。リクエストが正常に完了すると「同期」イベントが発生し、そうでない場合は「エラー」イベントが発生します。

したがって、これらのイベントへのバインドから始めることもできますが、いずれにしても、「同期」がその責任に焦点を合わせたままになるような、ある種のアプローチに固執する必要があります。

于 2013-01-29T03:16:27.790 に答える
2

@MattWhipple は、関心の分離について絶対に正しいです。UI ロジックを永続化レイヤーに混在させないでください。ただし、問題を分離する分離メカニズムを提供する限り、Backbone.sync メソッドをオーバーライドしてはならないという意味ではありません。

そのようなメカニズムの 1 つがmediatorパターンです。つまり、グローバル イベント バスを使用してメッセージを発行および消費します。たまたま、Backbone はイベント化されたグローバルBackboneオブジェクトでまさにそのようなメカニズムを提供します。同期をオーバーライドして、イベントをトリガーできます。

Backbone.trigger("request:start");

そして、UI レイヤーでそれを聞きます。

Backbone.on("request:start", callback);

このようにして、どちらのレイヤーもお互いを認識する必要がなく、グローバルなリクエスト処理を実現できます。

さらに、すべての AJAX リクエストをキャッチすることだけが必要で、それらが Backbone から発信されたかどうかを気にしない場合は、1 レベル下げて jQuery のグローバル イベントをリッスンし、Backbone を完全に除外することができます。

于 2013-01-29T07:37:29.003 に答える