2012-07-23 44 views
1

我目前正在使用Backbone.js Marionette框架重写已经存在的应用程序。新的堆栈应该是相当模块化的,这样可以很容易地添加新的控制器。该应用程序有一个node.js后端,并为每个调用提供一个json响应。Modular Backbone.js Marionette应用程序与控制器上的路由器 - 路由不工作

PlugUI.js:

应用程序使用(如已经说明的)的木偶应用程序定义 变种PlugUI =新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

任何帮助真的很感激。

回答

2

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

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

PlugUI.bind("initialize:after", function(optionns) { 
    console.log("initialize:after"); 
    Backbone.history.start(); 
}); 
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");  
}) 
0

我想这是未来相当晚了,但尝试启动骨干历史如下

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

我浪费了足够的时间在此。

PlugUI.on(“开始”)wouldnt工作,但在“之前:开始”会