【发布时间】:2013-05-29 19:59:18
【问题描述】:
我正在尝试将 Select2 小部件与 Backbone Marionette 视图集成。我的简单设置使用 Marionette.CollectionView 来创建和处理选择标签,并使用 Marionette.ItemViews 来呈现选项标签。
基本上是这样的:
SelectCollectionView = Backbone.Marionette.CollectionView.extend({
itemView : SelectItemView,
tagName : "select",
onRender : function() {
this.$el.select2();
},
onClose : function() {
this.$el.select2("destroy");
}
}
SelectItemView = Backbone.Marionette.ItemView.extend({
tagName : "option",
render : function() {
// create the needed option tags
}
}
如您所见,我必须在渲染和关闭时调用 Select2 的初始化和销毁方法,才能将所需的附加标签添加到 DOM。
只要处理选择标签 (SelectCollectionView) 的视图已经被添加到 DOM,这个设置就可以很好地工作。如果不是这样,Select2 的附加标签就会丢失,因为它们不是 SelectCollectionView 的 $el 的一部分,因此不会添加到 DOM 中。
我想知道如何优雅地解决这个问题?可以添加一个额外的 div 容器并在其中渲染所有内容,但这会为脚本和 DOM 生成额外的代码。这也使我的观点不那么通用。我只是希望有一个我没有想到的更好的解决方案。
【问题讨论】:
-
我不明白,您使用 onRender,因此 select 和所有选项元素都已渲染并添加到 dom。那么为什么你的解决方案不起作用?
-
@Luke 在 Backbone 上调用 render() 只会将视图呈现为其当前 el。那个 el 可能只存在于内存中,不需要已经附加到 DOM。这会给依赖于 DOM 内部工作的许多小部件带来问题——我选择 Select2 而不是 Chosen 的原因之一。
-
你试过用
onShow代替onRender吗?
标签: backbone.js marionette backbone-views jquery-select2