我目前正在使用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。
非常感谢任何帮助。
答案 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”会