为什么我不能在窗口大小调整时触发Backbone视图的功能?

时间:2015-03-05 20:20:16

标签: javascript jquery backbone.js

我在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。同样的问题。我确定我错过了一些小事。

3 个答案:

答案 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
}

我以前做过类似的事。我现在只是一个缓慢的日子。