我想显示一个菜单,如:
欧比旺克诺比 我的朋友 选项 我的光剑 蓝色光剑 绿色光剑 添加光剑
如您所见,My lightsabers
菜单是项目列表,但添加新光剑的链接是独立的。
我相信我应该使用 aCollectionView
来渲染光剑列表,但是如何渲染“添加”链接?
你有这样的菜单的例子吗?
这个问题可以概括为:如何自定义 Marionette 呈现的 HTML 位而不破坏它所做的事情?
我想显示一个菜单,如:
欧比旺克诺比 我的朋友 选项 我的光剑 蓝色光剑 绿色光剑 添加光剑
如您所见,My lightsabers
菜单是项目列表,但添加新光剑的链接是独立的。
我相信我应该使用 aCollectionView
来渲染光剑列表,但是如何渲染“添加”链接?
你有这样的菜单的例子吗?
这个问题可以概括为:如何自定义 Marionette 呈现的 HTML 位而不破坏它所做的事情?
我会为此使用 CompositeView,因为需要添加链接。
您将设置一个模板,其中包含实际列表的占位符,然后具有添加链接和所有必要的其他位。然后修改appendHtml
复合视图的方法以将实际项目放置在正确的位置。
例如,这里有一个模板可以让你走上正轨:
<script id="light-saber-menu-template" type="text/html">
<h4>My Lightsabers</h4>
<ul id="light-sabers">
<li class="divider"></li>
<li><a href="#">Add A Lightsaber</a></li>
<ul>
</script>
<script id="light-saber-menu-item-view" type="text/html">
<%= name %>
</script>
在此示例中,我将使用divider
ul 作为放置项目的位置,将它们插入到分隔符之前:
MenuItem = Backbone.Marionette.ItemView.extend({
template: "#light-saber-menu-item-template",
tagName: "li"
});
MenuView = Backbone.Marionette.CompositeView.extend({
template: "#light-saber-menu-template",
itemView: MenuItem,
appendHtml: function(cv, iv){
var $divider = cv.$(".divider");
$divider.before(iv.el);
}
});
myLightSabers = new LightSaberCollection(... data ...);
menu = new MenuView({
collection: myLightSabers
});
menu.render();
这应该会产生<ul>
您期望的项目:
<div>
<h4>My Lightsabers</h4>
<ul>
<li>Blue</li>
<li>Green</li>
<li>Red</li>
<li class="divider"></li>
<li><a href="#">Add A Lightsaber</a></li>
</ul>
<div>
有关使用 CompositeView 的更多示例,请参阅此博客文章: http: //lostechies.com/derickbailey/2012/04/05/composite-views-tree-structures-tables-and-more/