在 CollectionView 中的 Marionette 个 ItemView 之间注入 html

Inject html between Marionette ItemViews inside a CollectionView

我有一个集合视图(下面的MyCollView),并且想(有条件地)在不同的itemViews(下面的MyItemView)之间注入html 而不修改MyItemView。我知道 CollectionViews 可以有很多不同的选项,但没有看到任何用于此特定用途的选项。

更多细节:我想在 MyCollView 中的每个 MyItemView 之后注入一个 <br> 标记,只要 MyItemView 的实例不是集合中的最后一个。 这是我的集合视图将呈现的输出:

<div>name1</div>
<br>
<div>name2</div>
<br>
<div>name3</div>

这是我的代码:

MyItemView = Backbone.Marionette.ItemView.extend({
    template: _.template('<div><%= name %></div>')
});

MyCollView = Backbone.Marionette.CollectionView.extend({
    childView: MyItemView
    //ideally, I would like to provide some other property to accomplish my goal here, like...
    //separatorHtml: '<br>'
});

var myColl = new Backbone.Collection([
    {name: 'name1'},
    {name: 'name2'},
    {name: 'name3'}
]);

thisCollView = new MyCollView({
    collection: myColl
});

thisCollView.render();

我现在的想法是将 MyItemView 扩展为 MyModifiedItemView 并放入这个可选的 <br> 标签,但我不知道是否还有更多的 "marionette-y" 的方法。有什么想法吗?谢谢!

通常,您可以使用 Marionette 视图事件将 html 元素挂接到该视图的模板。没关系,如果您要附加的元素存在于 内部 视图的 el。你的情况有点棘手,因为你想在每个项目视图之外添加一个 <br/> 。 (如果您想确切地知道为什么这是一个问题,请在评论中问我)。相反,我们要做的是在添加子项时在父 CollectionView 中监听。

您也希望您添加的 <br> 元素是有条件的。我们可以利用内部 属性 的 Marionette 视图,view._index,连同对集合的引用 Backbone 添加到每个模型,来测试当前项目视图是否渲染的是最后一个。

将所有这些放在一起,您所要做的就是将 属性 添加到 MyCollView:

onAddChild : function (childview) {
    if (this.collection.length !== childview._index + 1)
        childview.$el.after('<br/>');
}

检查刚刚添加的子视图是否是集合中的最后一个视图。