我们有一个可怕的异步情况,而我们需要在路由器触发它的路由之前完成某些AJAX请求。
如何在Backbone Router触发任何路由之前确保某些AJAX请求已被触发?
我知道更多的概念性问题,但任何建议都表示赞赏!
答案 0 :(得分:2)
只有在调用Backbone.history.start
时才会触发路由:
开始 Backbone.history.start([options])
创建所有路由器并正确设置所有路由后,请调用Backbone.history.start()以开始监视hashchange事件并调度路由。
这意味着您可以在拨打此电话之前等待Ajax请求完成,从而实现您的目标。
假设您使用jQuery> = 1.5作为您的选择,并且您的Ajax请求是模型提取,您可以使用model.fetch
返回的Deferred objects来同步您的操作:
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();
});
一起玩的小提琴
答案 1 :(得分:0)
@nikoshr是对的。
另一种方法可能是阻止点击事件的自动路由,然后在完成ajax响应时手动触发route
事件。
$.when(xhr1, xhr2).then(function () {
router.trigger("route", "route-name", any_args);
});