Jquery 在ajax/延迟响应之后初始化Backbone.marionete.AppRouter

Jquery 在ajax/延迟响应之后初始化Backbone.marionete.AppRouter,jquery,ajax,backbone.js,marionette,jquery-deferred,Jquery,Ajax,Backbone.js,Marionette,Jquery Deferred,在执行一个请求和一些逻辑之后,我试图在控制器/中介的start()函数中初始化模块的AppRouter 这里的目标是确保用户满足应用程序的安全/认证要求,并获取更新的数据,用于完成在遵循路由时将触发的操作 基本上是加载页面,控制器start(),然后触发AJAX POST。根据AJAX响应的结果,我们将获得成功和大量json,在这种情况下,应该遵循路由,然后触发后续的控制器方法。(示例代码假定成功) 这个JSFIDLE中有一个更深入的示例。请注意console.log(): 我正在使用$.Def

在执行一个请求和一些逻辑之后,我试图在控制器/中介的
start()
函数中初始化模块的AppRouter

这里的目标是确保用户满足应用程序的安全/认证要求,并获取更新的数据,用于完成在遵循路由时将触发的操作

基本上是加载页面,控制器
start()
,然后触发AJAX POST。根据AJAX响应的结果,我们将获得成功和大量json,在这种情况下,应该遵循路由,然后触发后续的控制器方法。(示例代码假定成功)

这个JSFIDLE中有一个更深入的示例。请注意
console.log()

我正在使用
$.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
    });
});
如果我执行
deferred.resolve(),这就可以了在AJAX调用之外。但是,在呼叫中,当前路由从未触发。不过,所有后续路线都按预期工作

我是不是用错了

我对上班路线的理解有误吗

这是解决这个问题的一种完全愚蠢的方法吗

如有任何答复/建议,将不胜感激

谢谢

更新:

看起来我这里的主要问题是在
主干网。历史记录
启动后加载AppRouter。按此方式进行更新:

$.when(deferred).then(function(){
    MyApp.DashboardList.start();

    Backbone.history = Backbone.history || new Backbone.History({});
    Backbone.history.start();
});

这个问题是否有我可能忽略的地方?

从jQuery 1.5开始,$.ajax()返回的jqXHR对象实现Promise接口,为它们提供Promise的所有属性、方法和行为

这意味着您可以将ajax调用用于

因此,您需要的代码应该类似于:

$.when($.ajax('/organizations')).done(function() {
    DashboardList.router = new DashboardList.Router({
        controller: DashboardList.controller
    });
});

我不认为这会带来任何好处,因为它似乎只是不同的语法完成了相同的事情。问题似乎在于(我可能在所有这些方面都大错特错)主干.history的初始化发生在相关审批者之前,因此路由在绑定其处理程序之前就被触发了。不是吗?@amsross,的确,Boti的代码只是不同的语法,但这也是对“这是解决这个问题的一种完全愚蠢的方法吗?”:)这个问题的一个很好的回答。如果你将更新代码与Boti建议的结构结合起来,那么你最终会得到一些很酷的东西。只需稍加考虑,就可以避免使用
$.when()
包装器。