我有模特帖子和收藏帖子。并希望在<select id="multi" multiple="multiple">
中创建包含所有帖子列表的表单。所以我必须在我的#multi中使用这个模板进行PostView渲染:
<option value=""><%= title %></option>
但最后我用div包裹它。有没有使用<div>
包装此模板的解决方案?
答案 0 :(得分:33)
如果没有为视图定义el
(或tagName)(在类中或在实例化期间),视图将被放置在div标记内。 http://documentcloud.github.com/backbone/#View-el
var PostView = Backbone.View.extend({
tagName: 'option'
});
<强>更新强>
从v0.9.0开始,Backbone有view.setElement(element)来完成这项工作。
var PostView = Backbone.View.extend({
initialize: function() {
var template = _.template('<option value=""><%= title %></option>');
var html = template({title: 'post'});
this.setElement(html);
}
});
答案 1 :(得分:18)
如果您不希望视图包装HTML,则必须执行以下操作:
this.el
delegateEvents
el
醇>
render: function(){
var html = "some foo";
this.el = html;
this.delegateEvents(this.events);
}
由于Backbone会生成div
或其他标记(基于您对视图的tagName
设置),因此您必须完全替换它。这很容易做到。但是,当你这样做时,你会丢失你声明的事件,因为Backbone使用引擎盖下的jQuery delegate
来连接它们。要重新启用声明的事件,请调用delegateEvents
并传入事件声明。
结果是您的view.el
将成为您想要的<option>
标记,仅此而已。
答案 2 :(得分:4)
在0.9.0版本中,Backbone引入了view.setElement(element)
来处理此操作。