如何在ajax调用上执行控制器方法?

时间:2015-04-15 09:48:30

标签: javascript backbone.js marionette

在Marionette或Backbone中,路线在导航栏中更改网址时执行。有没有办法在ajax调用上执行路由?

2 个答案:

答案 0 :(得分:2)

如果您想触发路线更改,您可以执行以下操作,不建议这样做:

yourRouterInstance.navigate("your_url_that_is_mapped",{trigger:true});

相反,您需要将路线导航,数据加载和视图创建分离,并实现相同的效果。

  1. 创建一个控制器JS Object。
  2. 使用Backbone.Events扩展此对象。

    var AppController = _.extend({},Backbone.Events);
    
  3. 在此对象上创建方法并将它们绑定到事件 3.1此方法中的每一种都将通过所需的ajax加载适当的数据 3.2创建相应view的实例 3.3将加载的数据传递给view的实例 3.4调用navigate方法并将URL更新为相应的URL。

    AppController.on("any_custom_event",function(payload) {
        // MAKE THE AJAX CALL.
        // AFTER SUCCESSFUL CALL INSTANTIATE THE VIEW AND PASS THE DATA .
        // CALL yourAppRouter.navigate("your_current_url",{trigger:false});
    });
    
  4. 从路线回调/需要的位置触发此自定义事件。

    //in router callbacks
    AppController.trigger("any_custom_event",payload); 
    
    // In other places  where required like inside an ajax success call back:
    AppController.trigger("any_custom_event",payload); 
    

答案 1 :(得分:0)

来自Backbone文档:

  

导航

     

router.navigate(fragment,[options])

     

每当您在应用中确定要保存为网址时,请致电导航以更新网址。如果您还想调用路线功能,请将触发器选项设置为true。要更新网址而不在浏览器的历史记录中创建条目,请将替换选项设置为true

在ajax回调中,你可以做类似的事情,

$.ajax({
  success: function () {
    app.navigate('path/to/your/route', {trigger: true})
  }
})

或者使用原生JS(在任何地方都支持),您可以自己更改哈希:

$.ajax({
  success: function () {
    window.location = '#your/route/path/';
  }
})

那也将触发路径路径。

这两种解决方案都会在浏览器的历史记录中保存路线。