2013-02-26 45 views
1

我们有一个可怕的异步情况,而我们需要某些AJAX请求才能在路由器激发它的路由之前完成。确保AJAX请求在发射Backbone中的路由之前完成

如何确保在骨干路由器触发任何路由之前某些AJAX请求已被触发?

更多的是我知道的概念性问题,但任何建议表示赞赏!

回答

0

@nikoshr是正确的。

另一种方法是阻止点击事件的自动路由,然后在ajax响应完成时手动触发route事件。

$.when(xhr1, xhr2).then(function() { 
    router.trigger("route", "route-name", any_args); 
}); 
2

路线将触发只有当Backbone.history.start叫做:

开始Backbone.history.start
当你所有的路由器已创建([选项]),以及所有路由正确设置,调用Backbone.history.start()开始监视hashchange事件,并调度路由。

这意味着您可以通过在进行此调用之前等待完成Ajax请求来实现您的目标。

假设你使用jQuery> = 1.5为你的选择和你的Ajax请求的模型获取,您可以使用Deferred objects通过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/

相关问题