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()
包装器。