我目前正在使用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。
任何帮助真的很感激。