我在initialize函数中有一个$(window).on("resize", function)
侦听器的视图。我看到其他人就这样做了。
window.SidebarView = BaseView.extend({
el: "#sidebar-container",
template: HB.template("topics/sidebar"),
events: {
"click .sidebar-tab": "toggle_sidebar",
"click .fade": "check_external_click",
"click .sidebar-back": "sidebar_back_one_level"
},
initialize: function(options) {
var self = this;
$(window).on("resize", self.render);
// blah blah more code
},
render: function() {
var self = this;
this.$el.html(this.template());
// blah blah more code
}
在窗口调整大小时,我在this.$el.html(this.template());
render
收到错误,说未定义不是对象。我尝试将self.render
更改为this.render
。同样的问题。我确定我错过了一些小事。
答案 0 :(得分:0)
这是因为范围正在改变,当回调函数触发render()时,它将这个传递给窗口对象,并且窗口没有'有一个$ el参数。
您需要告诉您的函数要运行的上下文。您可以通过多种方式执行此操作.jQuery实际上具有专门用于此代理的功能
window.SidebarView = BaseView.extend({
el: "#sidebar-container",
template: HB.template("topics/sidebar"),
events: {
"click .sidebar-tab": "toggle_sidebar",
"click .fade": "check_external_click",
"click .sidebar-back": "sidebar_back_one_level"
},
initialize: function(options) {
var self = this;
$(window).on("click", $.proxy(self.render, self));
// blah blah more code
},
render: function() {
var self = this;
this.$el.html(this.template());
// blah blah more code
}
答案 1 :(得分:0)
jQuery更改了被称为事件的函数范围。
在您的实例中,这一行:
$(window).on("resize", self.render);
将render
方法的范围更改为window
。为了解决这个问题,请使用匿名函数作为回调函数,并在其原生范围内调用render方法。
initialize: function(options) {
var self = this;
$(window).on("resize", function(event) {
// Call render in the correct scope
self.render();
});
// blah blah more code
},
render: function() {
var self = this;
this.$el.html(this.template());
// blah blah more code
}
答案 2 :(得分:-1)
Sooo ......我最终修好了但是做了
initialize: function(options) {
var self = this;
$(window).on("resize", function() {
self.resize_sidebar();
});
// blah blah more code
}
我以前做过类似的事。我现在只是一个缓慢的日子。