我们有一个可怕的异步情况,而我们需要在路由器触发它的路由之前完成某些 AJAX 请求。
如何确保在主干路由器触发任何路由之前触发了某些 AJAX 请求?
我知道更多的概念性问题,但任何建议都值得赞赏!
我们有一个可怕的异步情况,而我们需要在路由器触发它的路由之前完成某些 AJAX 请求。
如何确保在主干路由器触发任何路由之前触发了某些 AJAX 请求?
我知道更多的概念性问题,但任何建议都值得赞赏!
路由只会在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/
@nikoshr 是正确的。
另一种方法是阻止点击事件的自动路由,然后route
在 ajax 响应完成时手动触发事件。
$.when(xhr1, xhr2).then(function () {
router.trigger("route", "route-name", any_args);
});