【问题标题】:Initialize Backbone.Marionette.AppRouter after ajax/deferred response在 ajax/延迟响应后初始化 Backbone.Marionette.AppRouter
【发布时间】:2013-11-08 22:43:15
【问题描述】:

在执行请求和一些逻辑之后,我正在尝试在 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();,这会正常工作。然而,在调用中,当前路由永远不会被触发。不过,所有后续路线都按预期工作。

我是不是用 deferred 错了?

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

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

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

谢谢!

更新:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我认为这在这里不会提供任何好处,因为它似乎只是完成相同事情的不同语法。似乎是什么问题(我可能在这一切上都错了)是 Backbone.history 的初始化发生在有问题的 AppRouter 之前,所以路由在它的处理程序被绑定之前就被触发了。没有?
    • @amsross,确实,Boti 的代码只是语法不同,但它也很好地回答了“这是解决这个问题的完全迟钝的方法吗?”这个问题。 :) 如果您要将更新代码与 Boti 建议的结构结合起来,那么您最终会得到一些很酷的东西。只需稍加思考,您就可以避免使用 $.when() 包装器。
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2020-10-08
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多