几次面临非常接近的问题,我的解决方案如下
1) Main - html 页面中的唯一脚本,加载应用程序 + 路由器 + 控制器 1) 应用程序 - 定义根区域,启动历史记录,2) AppRouter - 监视 url 匹配并调用控制器动作 3) AppController - 保持动作哈希,连接使用自己的操作订阅事件(如 App:switchpage),管理模型和视图。
在代码中(我使用 requireJS 按需加载):
main.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()
}
})
}
);
应用路由器
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'
}
})
})
}
);
应用控制器
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/上的 Brian Mann 截屏视频,尤其是 工程丰富的单页应用程序
并查看 David Sulc GitHub 和项目示例