В настоящее время я переписываю уже существующее приложение, используя фреймворк 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 через маршрутизатор, то в основном ничего не произойдет. Теперь я добавил событие во внешнем интерфейсе, чтобы показать представление в новом контроллере, и это работает, но я думал, что все должно работать через маршрутизатор. Я что-то не так понял?
Полный (не рабочий) исходный код можно найти в проекте github.
Любая помощь очень ценится.