App.Views.VideoView = Backbone.View.extend({
initialize: function() {
_.bindAll(this, 'render');
this.model = this.options.model;
this.render();
},
render: function() {
JST.video({
model: this.model
});
return this;
}
});
App.Views.PlayListView = Backbone.View.extend({
el: $("#playlistWrapper"),
initialize: function(videos) {
_.bindAll(this, 'render');
this.modelViews = $.map(videos.models, function(model, i) {
return new App.Views.VideoView({
model: model
});
})
this.render();
},
render: function() {
var that = this;
$(this.el).clear();
$.each(this.modelViews, function(i, modelView) {
$(that).el.append(modelView.render().el);
});
return this;
}
});
我总是低于错误
$(this.el).clear is not a function
[Break On This Error] $(this.el).clear();
看来我的 PlayerListView 是空的。
我有一个带有 id playlistWrapper 的 div。
如果我对 playlistWrapper 使用 jquery 选择器,它会给出正确的元素。
我究竟做错了什么。
我在这方面有点晚了,但问题是你在加载 DOM 之前指定了一个 jquery 选择器。
主干对象是通过传递给扩展方法的对象文字来定义的。例如,以下内容在功能上是相同的:
MyView = Backbone.View.extend({
el: "#foo"
});
var viewObj = {el: "#foo"};
MyView2 = Backbone.View.extend(viewObj);
对象字面量中键/值对右侧的值会立即被解析并执行。这意味着 jQuery 选择器用于el
将在声明后立即解析,而不是在实例化视图时解析。很可能,您的应用程序中包含了 javascript 文件,并且在加载 DOM 之前下载了该文件,因此 jquery 选择器无法找到您所引用的元素。
您可以采取多种措施来解决此问题。
- 你可以打电话
$(this.el)
每当你需要使用该元素时
- 你可以设置
this.el
在视图初始值设定项中
- 你可以设置
{el: $("#whatever")}
作为视图构造函数的参数,假设视图是在 DOM 加载后构造的
- 您可以使用 javascript 模块模式将视图和其他主干对象的定义推迟到 DOM 加载之后
- 可能还有一些我目前没有想到的其他选择
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)