使用Backbone.Marionette从JSON动态生成站点导航
Dynamically generate site navigation from JSON with Backbone.Marionette
我正在尝试根据REST API返回的JSON对象的内容构建导航。我一直在试图适应David Sulc的教程,但我在某个地方遇到了一点阻碍。
我的应用程序使用以下基本结构:
window.Foo = {
Routers: {},
Models: {},
Collections: {},
Views: {},
Controllers: {}
};
Foo.App = new Backbone.Marionette.Application({});
Foo.App.addRegions({
navRegion: '#nav-wrapper'
});
Foo.App.on("initialize:after", function(options){
if (Backbone.history){
Backbone.history.start();
}
});
/* MODELS & COLLECTIONS */
// Nav
Foo.Models.Nav = Backbone.Model.extend({});
Foo.Collections.Nav = Backbone.Collection.extend({
model: Foo.Models.Nav,
url: '/static/js/data/nav.json'
});
/* VIEWS */
Foo.Views.NavLayout = Backbone.Marionette.Layout.extend({
className: 'scroll',
template: navTemplate,
regions: {
'primary': '#primary-nav'
}
});
Foo.Views.navItemView = Backbone.Marionette.ItemView.extend({
tagName: 'li',
template: navItemTemplate
});
Foo.Views.PrimaryNav = Backbone.Marionette.CollectionView.extend({
tagName: 'ul',
itemView: Foo.Views.navItemView
});
/* CONTROLLER */
Foo.Controllers.Controller = {
navLayout: new Foo.Views.NavLayout(),
primaryNav: new Foo.Views.PrimaryNav({collection: Foo.navCollection}),
home: function() {
Foo.App.navRegion.show(this.navLayout);
this.navLayout.primary.show(this.primaryNav);
}
}
/* ROUTER */
Foo.Routers.Router = Backbone.Marionette.AppRouter.extend({
controller: Foo.Controllers.Controller,
appRoutes: {
'': 'home'
}
});
/* INITIALIZER */
Foo.App.addInitializer(function(options) {
Foo.navCollection = new Foo.Collections.Nav();
Foo.navCollection.fetch();
Foo.router = new Foo.Routers.Router();
});
return Foo;
一切似乎都正常工作,除了Foo.Views.navItemView从未被渲染到PrimaryNav视图。我可以看到JSON在控制台中被成功加载,但是只有包含的UL (Foo.Views.PrimaryNav)被渲染。在获取集合和在控制器中显示视图之间,我显然缺少了一个步骤。
任何指示将非常感激!
更新:我重做了我的应用结构并把Nav集合的东西从addInitializer移到了控制器中,现在它能工作了。更新的简化结构:
window.Foo = {
Routers: {},
Models: {},
Collections: {},
Views: {},
Controllers: {}
};
Foo.App = new Backbone.Marionette.Application({});
Foo.App.addRegions({
navRegion: '#nav-wrapper'
});
Foo.App.on('initialize:after', function(options){
if (Backbone.history){
Backbone.history.start();
}
});
/* MODELS & COLLECTIONS */
// Nav
Foo.Models.Nav = Backbone.Model.extend();
Foo.Collections.PNav = Backbone.Collection.extend({
model: Foo.Models.Nav,
url: '/static/js/data/primary-nav.json'
});
/* VIEWS */
// Nav
Foo.Views.NavLayout = Backbone.Marionette.Layout.extend({
className: 'scroll',
template: navTemplate,
regions: {
'primary': '#primary-nav',
'favourites': '#favourites-nav'
}
});
Foo.Views.navItemView = Backbone.Marionette.ItemView.extend({
model: Foo.Models.Nav,
tagName: 'li',
template: navItemTemplate
});
Foo.Views.PrimaryNav = Backbone.Marionette.CollectionView.extend({
tagName: 'ul',
itemView: Foo.Views.navItemView
});
/* CONTROLLER */
Foo.Controllers.Controller = {
setupHasRun: false,
setup: function() {
var navLayout = new Foo.Views.NavLayout(),
primaryNavCollection = new Foo.Collections.PNav(),
primaryNavFetch = primaryNavCollection.fetch({async: false}),
primaryNav = new Foo.Views.PrimaryNav({collection: primaryNavCollection}),
Foo.App.navRegion.show(navLayout);
navLayout.primary.show(primaryNav);
this.setupHasRun = true;
}
}
/* ROUTER */
Foo.Routers.Router = Backbone.Marionette.AppRouter.extend({
controller: Foo.Controllers.Controller,
appRoutes: {
// Home
'': 'home'
}
});
/* INITIALIZER */
Foo.App.addInitializer(function(options) {
Foo.router = new Foo.Routers.Router();
contentPanes();
});
return Foo;
David Sulc写了一本关于木偶的书,查看书中示例的git repo
https://github.com/davidsulc/marionette-gentle-introduction从你的代码中,我建议像例子中那样在模块上组织代码,而不是像你那样在全局对象中组织代码。
然后每个模块将有一个控制器,你可以使用它们来导航应用程序的所有部分。
也可以查看木偶的官方文档。
https://github.com/marionettejs/backbone.marionette/tree/master/docs相关文章:
- 动态更改'汉堡包'导航取决于BG图像
- 动态生成导航栏和AngularJS
- 有没有一种方法可以基于Angular 2中注册的路线构建动态导航/菜单
- html5:变成导航栏的动态标题
- 动态html页面导航
- 在跨域站点中动态调整iframe的大小
- 骨干路由器.导航如何传递动态ID
- 如何将活动状态类动态更改(添加)到导航链接
- 如何缓存包含 1890000 个页面的动态站点并将其静态托管在 AWS 上
- 使用PhantomJS的动态组合下拉框抓取 ASP.NET 站点
- 从站点根目录之外的目录动态加载图片
- Angularjs:隐藏包含动态参数的网址的导航栏
- 动态导航链接
- 从另一个站点获取动态创建的图像的解决方案
- 使用Backbone.Marionette从JSON动态生成站点导航
- 响应式站点导航菜单的jQuery点击事件冲突
- 如何在静态站点上动态呈现社交分享按钮的元标签
- 使用带有锚标记的curtain.js进行站点导航
- 如何从站点rails动态获取link_to的参数
- 将AngularJS添加到OrchardCMS站点的动态表单中