模块化Backbone.js Marionette应用程序与控制器上的路由器 - 路由无法正常工作

时间:2012-07-23 17:16:53

标签: backbone.js marionette backbone-routing

我目前正在使用Backbone.js Marionette框架重写已有的应用程序。新的堆栈应该是相当模块化的,因此可以非常容易地添加新的控制器。该应用程序有一个node.js后端,并为每个调用提供一个json响应。

使用(如已经陈述的)Marionette应用程序来定义应用程序:

PlugUI.js:     var PlugUI = new Backbone.Marionette.Application();

PlugUI.addRegions({
//  adminBarRegion: "#adminbar",
  contentRegion: "#content"
});

PlugUI.bind("routing:started", function(options){
  Backbone.history.start();
  PlugUI.Navigation.showNavigation();
});

Backbone.Marionette.TemplateCache.prototype.loadTemplate = function(templateId, callback){
  ...
});
}

所以,我想,这是相当标准的。然后我提供了一个“控制器”,其中包含一些相当标准的内容(意思是模型,视图和路由器方法),如下所示:

PlugUI.module("Status", function(Status, PlugUI, Backbone, Marionette, $, _) {
  // define the model
  Status.Status = Backbone.Model.extend({
    defaults: {
       ...
    },
    urlRoot: function() {
      return '/api/status';
    },

    fetchStatus: function() {
      var status = new Status.Status();
      status.fetch({
        success: function(data, response){
          Status.showStatus(response);
        }
      })
    }
  });

  Status.showStatus = function(model){
  var status = new Status.Status(model);
  var statusView = new Status.StatusView({
    model: status
  });

  PlugUI.layout.main.show(statusView);
  // add trigger, so that navbar is shown ;-)
  PlugUI.vent.trigger("navbar:show", "status-icon");
}

Status.StatusView = Backbone.Marionette.ItemView.extend({
  tagName: "div",
  className: "one-third column statusbox",
  template: "#status"
});

Status.Router = Backbone.Marionette.AppRouter.extend({
  appRoutes: {
    "status": "showUniqueStatus"
  }
});  

PlugUI.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: PlugUI.Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})
})

这很好用,只要我直接触发这个控制器的视图。如果我在那里添加另一个具有相同内容的控制器并通过路由器触发show方法,那么基本上没有任何反应。我现在在前端添加了一个事件,在新控制器中显示视图,这确实有效,但我认为这些东西应该通过路由器工作。我明白了什么不对吗?

有关完整(不可用)的源代码,请查看the github project

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

我不完全确定,但我认为问题是你的初始化程序(假设你使用的是最新的Backbone.Marionette版本):


PlugUI.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: PlugUI.Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})

尝试使用Status.addInitializer


Status.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})

答案 1 :(得分:2)

对不起真的很长时间的延迟,但是......

建议的解决方案(移动初始化器)是解决方案的一部分。此外,我触发了事件“routing:started”,此事件触发了“Backbone.history.start();”。我已将此方法的调用移至“初始化:之后”,现在一切正常。

PlugUI.bind("initialize:after", function(optionns) {
  console.log("initialize:after");
  Backbone.history.start();
});

答案 2 :(得分:0)

我想这已经很晚了,但是尝试按照以下方式启动Backbone历史记录

PlugUI.on("before:start", function(options) {
   console.log("Starting history before start");
   Backbone.history.start();};

我浪费了足够的时间。

PlugUI.on(“start”)无法正常工作,但是“before:start”会