0

我正在尝试在 Controller/Mediator 中初始化我的模块的 AppRouterstart()在执行请求和一些逻辑之后,

此处的目标是确保用户满足应用程序的安全/身份验证要求,并获取更新的数据以用于完成在遵循路线时将触发的操作。

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

更深入的示例在这个 jsfiddle 中。注意console.log()'s:http: //jsfiddle.net/N5z2R/

我正在使用 a$.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 调用的外部,这可以正常工作。然而,在调用中,当前路由永远不会被触发。不过,所有后续路线都按预期工作。

我使用延迟错误吗?

我对如何理解触发工作的路线有误吗?

这是解决这个问题的完全迟缓的方法吗?

任何答案/建议将不胜感激。

谢谢!

更新:

看起来我的主要问题是在Backbone.history启动后加载 AppRouter。像这样更新它有效:

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

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

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

4

1 回答 1

0

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

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

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

$.when($.ajax('/organizations')).done(function() {
    DashboardList.router = new DashboardList.Router({
        controller: DashboardList.controller
    });
});
于 2013-11-09T18:06:32.690 回答