面對非常密切的問題幾次,我的解決方案是繼
1)主 - 在HTML頁面中唯一的腳本,負載應用+路由器+控制器 1)應用 - 確定根地區,開始歷史, 2 )AppRouter - 監視URL匹配和呼叫控制器動作 3)AppController的 - 保持動作哈希,掛鉤事件訂閱(例如App:switchpage)用自己的行動,管理模型和視圖。
在代碼(一用於按需加載requireJS):
主。JS
define(
[
'application',
'appRouter',
'appController'
],
function(Application, Router, Controller) {
var App = new Application;
App.addInitializer(function() {
this.controller = App.Controller;
this.router = App.Router({
controller: this.controller
})
})
}
);
應用
define(
[
'marionette',
'backbone'
],
function(Marionette, Backbone) {
return Marionette.Application.extend({
regions: {
'main': '#body'
},
onStart: function() {
Backbone.history.start()
}
})
}
);
appRouter
define(
[
'application'
],
function(Application) {
Application.module('AppRouter', function(Module, App, Backbone, Marionette) {
App.Router = Marionette.AppRouter.extend({
//for example : page/home page/goods page/user
appRouter: {
'page/*': 'switchPage'
}
})
})
}
);
AppController的
define(
[
'marionette'
],
function(Marionette) {
Application.module('AppRouter', function(Module, App, Backbone, Marionette) {
App.Controller = Marionette.Controller.extend({
switchPage: function(path) {
//path (user || home || some)
require(['views/'+path], function(pageView) {
App.main.show(new pageView)
})
}
})
})
}
);
頁/家
define(
[
'marionette',
'underscore'
],
function(Marionette, _) {
return Marionette.ItemView.extend({
template: _.template("home page")
})
}
);
它只是一個樣機,我已刪除的代碼某些部分,以保持應用程序的唯一的想法。爲了使其更具可擴展性,您可以將頁面定義爲具有自己的控件和代碼的模塊。
每晚建議您在http://www.backbonerails.com/結帳布賴恩·曼截屏,特別是Engineering Rich, Single Page Apps 和結算大衛Sulc GitHub上與project example
德里克建議[應用級別事件聚合(http://lostechies.com/derickbailey/2012/ 04/03/revisiting-the-backbone-event-aggregator-lessons-learned /),也就是說,這個問題不適合SO,最好在[程序員](http://programmers.stackexchange)上詢問。 COM)。投票結束。 – steveax 2014-10-30 03:52:54
當我引用'page:change:x'或'App.execute'時,我實際上是在討論在marionettejs中默認實現的應用程序級事件聚合器。 – Tom 2014-10-30 04:47:52