在ajax / deferred响应之后初始化Backbone.Marionette.AppRouter

时间:2013-11-08 22:43:15

标签: jquery ajax backbone.js marionette jquery-deferred

我正在尝试在执行请求和某些逻辑之后在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();
});

这有什么问题我可能会忽略吗?

1 个答案:

答案 0 :(得分:0)

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

这意味着您可以将{ajax调用与deffered一起使用。

所以你需要的代码应该类似于:

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