当我尝试导入看起来像这样的模板时,我似乎遇到了使用backbone.js / underscore.js的砖墙:
<script type="text/template" id="overview_template">
<div>
Sample text
</div>
</script>
错误如下:
Uncaught TypeError: Object #<HTMLDivElement> has no method 'html' navigation.js:356
Backbone.View.extend.render navigation.js:356
Backbone.View.extend.initialize navigation.js:351
g.View backbone-min.js:33 d backbone-min.js:38
(anonymous function) navigation.js:379
f.Callbacks.n jquery-1.7.1.min.js:2
f.Callbacks.o.fireWith jquery-1.7.1.min.js:2
e.extend.ready jquery-1.7.1.min.js:2 c.addEventListener.B
触发错误的代码如下this.el.html(template);
:
var OverviewView = Backbone.View.extend({
el: $('#overview_container'),
initialize: function() {
this.render();
},
render: function() {
var template = _.template( $("#overview_template").html(), {} );
this.el.html(template);
},
defaults: {
tip_of_the_day: 'open',
news: 'open',
recent_presentations: 'open'
},
events: {
"click .overview_subsection_header": "toggleSubsection"
},
toggleSubsection: function (event) {
$(this).parent().find('.overview_subsection_content').toggle();
}
});
var overview_view = new OverviewView();
我不确定是什么导致这种情况,但它一直让我疯狂。
答案 0 :(得分:7)
.html()方法是jQuery对象的方法。当你使用this.el时 - 它是一个DOM对象。获取jQuery对象使用此。$ el(它由backbone.js jQuery对象缓存)或$(this.el)。
因此,您的代码应如下所示:
render: function() {
var template = _.template( $("#overview_template").html(), {} );
this.$el.html(template);
}
或
render: function() {
var template = _.template( $("#overview_template").html(), {} );
$(this.el).html(template);
}
答案 1 :(得分:4)
不应该是
this.$el.html(template);
即。 jQuery包裹了el。
答案 2 :(得分:2)
您正尝试将视图连接到现有元素#overview_container
。但是肯定是在浏览器初始化DOM之前创建了视图类。
由于您的模板存储在#overview_container
,因此您可能不希望视图在该元素中呈现?尝试删除视图上的el
属性,并将视图的元素附加到页面中的任何位置。
此外,从this
方法返回render
是一种Backbone约定,因此您可以轻松地渲染和附加元素,如下所示:
$(document.body).append((new OverviewView()).render().el);
如果您愿意,可以在初始化工具中render
,但这不是标准做法。
答案 3 :(得分:0)
尝试
this.$el.html(template)
而不是
this.el.html(template)