EDIT3:警告!这个答案可能已经过时了。我收到一条评论说这个答案不再有效并且没有时间调查(我个人不使用这种方法)。
我喜欢使用 Twitter/Bootstrap 作为我的 UI 库,并且由于默认的标签包装(特别是<div>
my<tbody>
和 my <tr>
s 之间的 a )而在表格样式方面遇到了一些问题。
经过一番挖掘,我在 Marionette 文档中找到了Region
关于如何View
将el
. Backboneel
从各种View
属性构建,并保持构建的元素是最新的,因此它可以随时呈现。所以我想,如果view.el
是父级,为什么不直接使用 HTML 内容呢?Marionette 还提供了一种方法来创建自定义Region
我能够通过创建Region
具有覆盖open
功能的自定义来运行所有内容。这样我就可以指定我想用标签包装哪些区域以及我不想包装哪些区域。在下面的示例片段中,我创建了我的自定义非包装Region
( ) 并在我的( ) 中NowrapRegion
使用它作为我的(我在我的真实程序中传递的视图 create s)。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', //thead
rows: { selector: '#rows', regionType: NowrapRegion } //tbody
}
});
繁荣!想要的时候包,不想的时候不包。
编辑:这似乎会影响events
在*View
级别上应用。我还没有调查过,但请注意它们似乎没有被触发。
这是否是“正确”的做法,我不确定。如果他看到这一点,我会欢迎来自@derick-bailey 的任何反馈。
EDIT2: @chris-neale 提出了以下建议,我还没有验证这一点,但它似乎是合理的。谢谢!
与其在视图中复制 html,不如在子节点上使用深度克隆将维护事件和数据。
var NowrapRegion = Marionette.Region.extend({
open: function(view){
view.$el.children().clone(true).appendTo(this.$el);
}
});