1

恐ろしい非同期の状況がありますが、ルーターがルートを起動する前に、特定のAJAXリクエストを完了する必要があります。

バックボーンルーターがルートを起動する前に、特定のAJAXリクエストが起動したことを確認するにはどうすればよいですか?

私が知っている概念的な質問の詳細ですが、アドバイスをいただければ幸いです。

4

2 に答える 2

2

Backbone.history.startルートは、が呼び出されたときにのみ起動します:

start Backbone.history.start([options])
すべてのルーターが作成され、すべてのルートが適切に設定されたら、Backbone.history.start()を呼び出して、ハッシュ変更イベントの監視とルートのディスパッチを開始します。

これは、この呼び出しを行う前にAjaxリクエストが完了するのを待つことで、目的を達成できることを意味します。

選択した$としてjQuery>=1.5を使用し、Ajaxリクエストがモデルフェッチであると仮定すると、によって返されるDeferredオブジェクトmodel.fetchを使用してアクションを同期できます。

var Router = Backbone.Router.extend({
    routes: {
        '': 'index'
    },

    index: function() {
        console.log('route')
    }
});

var M = Backbone.Model.extend({
    url: '/echo/json/?delay=1'
});

var r = new Router();
var m1 = new M();
var m2 = new M();

var xhr1 = m1.fetch(),
    xhr2 = m2.fetch();

$.when(xhr1, xhr2).then(function() {
    console.log('requests');
    Backbone.history.start();
});

そしてhttp://jsfiddle.net/nikoshr/fnsqU/で遊ぶフィドル

于 2013-02-26T11:07:18.850 に答える
0

@nikoshrは正しいです。

別のアプローチは、クリックイベントでの自動ルーティングを防ぎroute、ajax応答が完了したときにイベントを手動でトリガーすることです。

$.when(xhr1, xhr2).then(function () { 
   router.trigger("route", "route-name", any_args);
});
于 2013-02-26T11:12:56.103 に答える