恐ろしい非同期の状況がありますが、ルーターがルートを起動する前に、特定のAJAXリクエストを完了する必要があります。
バックボーンルーターがルートを起動する前に、特定のAJAXリクエストが起動したことを確認するにはどうすればよいですか?
私が知っている概念的な質問の詳細ですが、アドバイスをいただければ幸いです。
恐ろしい非同期の状況がありますが、ルーターがルートを起動する前に、特定のAJAXリクエストを完了する必要があります。
バックボーンルーターがルートを起動する前に、特定のAJAXリクエストが起動したことを確認するにはどうすればよいですか?
私が知っている概念的な質問の詳細ですが、アドバイスをいただければ幸いです。
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();
});
@nikoshrは正しいです。
別のアプローチは、クリックイベントでの自動ルーティングを防ぎroute
、ajax応答が完了したときにイベントを手動でトリガーすることです。
$.when(xhr1, xhr2).then(function () {
router.trigger("route", "route-name", any_args);
});