了解更多关于您的目标会有所帮助,但这里有一个答案。让我知道它是否有帮助!
假设这是您的 HTML 布局:
<div id="app">
<div id="app_nav">
<a href="#music">Music</a>
<a href="#books">Books</a>
</div>
<div id="sub_app"></div>
</div> <!-- /#app_main -->
对于我们的“音乐”子应用,我们将使用这个模板:
<script id="musicApp-template" type="template/html">
<div class="albums"></div>
<div class="artists"><div>
</script>
对于专辑项目视图:
<script id="album-template" type="template/html">
<img src="<%=albumThumbSrc %>" />
<p><%=albumTitle %></p>
</script>
对于艺术家项目视图:
<script id="artist-template" type="template/html">
<%=firstName %> <%=lastName %>
</script>
--
对于我们的“书籍”子应用,我们将使用这个模板:
<script id="booksApp-template" type="template/html">
<div class="books"></div>
<div class="authors"></div>
</script>
对于图书项目视图:
<script id="book-template" type="template/html">
<img src="<%=bookThumbSrc %>" />
<p><%=bookTitle %></p>
</script>
对于艺术家项目视图:
<script id="author-template" type="template/html">
<%=firstName %> <%=lastName %>
</script>
并引导应用程序:
$(document).ready({
myApp.start();
if(!Backbone.history.started) Backbone.history.start();
});
--
现在设置我们的 Marionette 视图。
在 myApp.js 中
var myApp = new Backbone.Marionnette.Application();
myApp.addRegions({
subAppRegion: "#sub_app"
});
// Your data
myApp.artists = new Backbone.Collection([...]);
myApp.books = new Backbone.Collection([...]);
在 myApp.musicApp.js
myApp.module("musicApp", function(musicApp, myApp) {
/* Setup your Views
================== */
var MusicLayout = Backbone.Marionette.Layout.extend({
template: #musicApp-template",
regions: {
albumsRegion: ".albums",
artistsRegion: ".artists"
}
});
var AlbumView = Backbone.Marionette.ItemView.extend({
template: "#album-template"
});
var AlbumListView = Backbone.Marionette.CollectionView({
itemView: AlbumView
});
var ArtistView = ...
var ArtistListView = ...
/* Create router for app navigation
==================================== */
var Router = Backbone.Marionette.AppRouter.extend({
appRoutes: {
"music" : showMusicApp
},
controller: musicApp
});
new Router();
/* Method to show the music app
================== */
musicApp.showMusicApp = function() {
// Instantiate Views
var musicLayout = new MusicLayout();
var albumListView = new AlbumListView({ collection: myApp.albums });
var artistListView = new ArtistsListView({ collection: myApp.artists });
// Show musicApp layout in subAppRegion of main app
myApp.subAppRegion.show(musicLayout);
// Show albums and artists in musicApp layout
layout.albumsRegion.show(albumListView);
layout.artistsRegion.show(artistListView);
}
});
myApp.booksApp
你可以用同样的方式设置你的模块:
myApp.module("booksApp", function(booksApp, myApp) {
...
var Router = Backbone.Marionette.AppRouter.extend({
appRoutes: {
"books" : showBooksApp
},
controller: booksApp
});
new Router();
booksApp.showBooksApp = function() {
...
myApp.subAppRegion.show(booksLayout)
...
}
...
});
我还没有测试所有这些代码,如果有一些问题很抱歉,我相信它可以改进。
如果您还没有阅读David Sulc 的教程,您应该看一下 - 它会让您更好地了解完整的应用程序。但我希望这能让您对如何使用布局和区域来显示不同的 subApp 视图有一个基本的了解。