我尝试将Select 2小部件与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
}
}
正如您所看到的,我必须在呈现和关闭时调用Select 2 initialize和destroy方法,以便将所需的其他标记添加到DOM中。
只要处理select标记的视图(SelectCollectionView)已经被添加到DOM中,这种设置就可以很好地工作。如果不是这样,Select 2的附加标记就会丢失,因为它们不是SelectCollectionView的$el的一部分,因此不会被添加到DOM中。
我想知道如何优雅地解决这个问题?可以添加一个额外的div容器,并在其中呈现所有内容,但这将为脚本和DOM产生额外的代码。这也使我的视图不那么通用。我只是希望有一个更好的解决方案,我没有想到。
2条答案
按热度按时间mnemlml81#
正如您所猜想的那样,您需要一个包含div来包围模板。幸运的是,这真的很简单。与您当前拥有的不同:
去掉
tagName
,在你的模板中(我假设你使用Handlebars或者Underscore或者类似的东西),定义你的HTML:模板. html
然后在你看来:
选择集合视图. js
Marionette将自动在
<select>
周围包裹一个div,然后select2添加的所有额外标记都将安全地包含在视图的$el
中。798qvoo82#
我花了一些时间才弄明白,但我以前是这样解决的:
重要的是
它选择元素中的select标记。但是在我的例子中我没有使用集合视图。如果你需要获取数据,你可以用途:
此外,select2还提供了非常好的API,用于在运行时操作选择项。