编辑3:警告!此答案可能已过时。我收到一条评论称,此答案不再起作用,并且没有时间进行调查(我个人不使用此方法)。
我喜欢使用Twitter/Bootstrap作为我的UI库,但由于默认标签包装(特别是在我的<tbody>
和<tr>
之间有一个<div>
),我的表格样式出现了一些问题。
经过一番搜索,我在Marionette文档的Region
章节找到了有关View
如何附加el
的内容。Backbone从各种View
属性中构建el
并保持构建出的元素始终更新,以便随时呈现。因此,我想,如果view.el
是父级,为什么不直接使用HTML内容呢? Marionette还提供了一种创建自定义Region
的方式。
我通过创建一个自定义的
Region
并重写
open
函数来使一切正常运行。这样我就可以指定哪些区域要用标签包装,哪些不需要。在下面的示例片段中,我创建了我的自定义非包装
Region
(
NowrapRegion
),并在我的
Layout
(
MyLayout
)中使用它来处理
<tbody>
(我在实际程序中传递的视图创建
<tr>
)。
var NowrapRegion = Marionette.Region.extend({
open: function(view){
this.$el.html(view.$el.html());
}
});
var MyLayout = Marionette.Layout.extend({
template: templates.mylayout,
regions: {
foo: '#foo',
columns: '#columns',
rows: { selector: '#rows', regionType: NowrapRegion }
}
});
BOOM! 我需要时包装,不需要时不包装。
编辑:这似乎影响应用于*View
级别的events
。我还没有研究过,但请注意它们似乎没有被触发。
无论这是否是“正确”的方法,我不确定。如果@derick-bailey看到这个消息,我将欢迎任何反馈。
编辑2:@chris-neale建议以下操作,我尚未验证,但似乎很合理。谢谢!
而不是复制视图中的html,在子节点上使用深克隆将维护事件和数据。
var NowrapRegion = Marionette.Region.extend({
open: function(view){
view.$el.children().clone(true).appendTo(this.$el);
}
});