我正在尝试在执行请求和某些逻辑之后在Controller / Mediator的start()
函数中初始化我的模块的AppRouter。
此处的目标是确保用户满足应用程序的安全/身份验证要求,并获取更新的数据,以便在完成遵循路由时将触发的操作时使用。
基本上页面加载,控制器start()
,然后触发AJAX POST。根据AJAX响应的结果,我们将获得成功和一堆json,在这种情况下应该遵循路由,然后触发后续的控制器方法。 (示例代码假定成功)
这个jsfiddle中有一个更深入的例子。请注意console.log()
的:http://jsfiddle.net/N5z2R/
我正在使用$.Deferred()
来确定ajax调用是否成功完成:
var deferred = new $.Deferred();
$.ajax({
url: '',
type: 'POST'
}).done(function( data, textStatus, jqXHR ) {
// all good, get started
deferred.resolve();
});
$.when(deferred).then(function() {
DashboardList.router = new DashboardList.Router({
controller: DashboardList.controller
});
});
如果我在AJAX调用之外执行deferred.resolve();
,这可以正常工作。但是,在通话中,当前路线永远不会被触发。但是,所有后续路线都按预期工作。
我使用延期错误吗?
我是否理解我如何理解开除工作的路线?
这是解决这个问题的绝对方法吗?
任何答案/建议都将不胜感激。
谢谢!
更新
看起来我的主要问题是在Backbone.history
启动后加载AppRouter。像这样更新它的工作原理:
$.when(deferred).then(function(){
MyApp.DashboardList.start();
Backbone.history = Backbone.history || new Backbone.History({});
Backbone.history.start();
});
这有什么问题我可能会忽略吗?
答案 0 :(得分:0)
jQuery 1.5中$ .ajax()返回的jqXHR对象实现了 Promise 接口,为它们提供了Promise的所有属性,方法和行为。
这意味着您可以将{ajax调用与deffered一起使用。
所以你需要的代码应该类似于:
$.when($.ajax('/organizations')).done(function() {
DashboardList.router = new DashboardList.Router({
controller: DashboardList.controller
});
});