1

我们有一个可怕的异步情况,而我们需要在路由器触发它的路由之前完成某些 AJAX 请求。

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

我知道更多的概念性问题,但任何建议都值得赞赏!

4

2 回答 2

2

路由只会在Backbone.history.start被调用时触发:

start Backbone.history.start([options])
当你的所有路由器都创建好并且所有路由都设置正确后,调用 Backbone.history.start() 开始监控 hashchange 事件并调度路由。

这意味着您可以通过在进行此调用之前等待您的 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 回答