Javascript 如何在没有包装器的情况下将Backbone.View.el绑定到模板?
这是我正在使用的模板Javascript 如何在没有包装器的情况下将Backbone.View.el绑定到模板?,javascript,backbone.js,Javascript,Backbone.js,这是我正在使用的模板 <script type="text/template" id="template-message"> <p class="message"><%= message %></p> </script> 我如何使用它 var msg = new Message({message: "hello"}), view = new MessageView({model: msg}); $("body").ap
<script type="text/template" id="template-message">
<p class="message"><%= message %></p>
</script>
我如何使用它
var msg = new Message({message: "hello"}),
view = new MessageView({model: msg});
$("body").append(view.render().el);
输出
<body>
<div>
<p class="message">
hello
</p>
</div>
</body>
我知道在我看来这是可能的
var MessageView = Backbone.View.exntend({
tagName: "p",
className: "message",
// ...
});
最终用户将定义模板,因此我不希望在主干中指定这些内容。查看源代码
如何获得所需的输出并将视图绑定到html?多亏@Gohn67的评论,我才能够实现这一点
var MessageView = Backbone.View.extend({
template: _.template(Backbone.$("#template-message").html()),
initialize: function() {
this.setElement(this.template(this.model.attributes));
}
});
如果我们看一下,我们可以看到它setElement
做了我们想要它做的一切
// backbone source code
setElement: function(element, delegate) {
if (this.$el) this.undelegateEvents();
this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);
this.el = this.$el[0];
if (delegate !== false) this.delegateEvents();
return this;
},
它甚至可以处理事件委托。酷
我最近不得不在jQuery1.3.2上实现这一点Gross,我知道,但这只是一个简单的修复 唯一改变的部分是
setElement
位
initialize: function() {
this.setElement(
$( this.template(this.model.attributes) )
);
}
模板
结果必须包装在$()
中才能工作。我知道,考虑到主干网已经在尝试自动完成这项工作,这没有多大意义。这是我唯一能让它与jQuery 1.3.2一起工作的方法。您也可以使用(我已经编写)并定义el
属性,如标记名,类名等,作为模板中的数据属性。请参阅。强制最终用户扩展BaseMessageView。最终用户将只定义HTML模板。他们没有创建JS源文件。显然你可以使用setElement
。请看这里@Gohn67,谢谢你的指点。在你的帮助下,我提交了这个问题的答案。
// backbone source code
setElement: function(element, delegate) {
if (this.$el) this.undelegateEvents();
this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);
this.el = this.$el[0];
if (delegate !== false) this.delegateEvents();
return this;
},
initialize: function() {
this.setElement(
$( this.template(this.model.attributes) )
);
}