0

我想绑定checkScroll()到视图PhotoListView,以便我可以this.checkScroll()从内部调用,$(Window).scroll()而无需先var self = this调用self.checkScroll().

问题:但是绑定似乎不起作用,并且我收到错误Uncaught TypeError: Object [object Window] has no method 'checkScroll'我绑定错误了吗?

看法

PhotoListView = Backbone.View.extend({
    el: '#photo_list',

    initialize: function() {
        _.bindAll(this, 'checkScroll');
        this.bind('checkScroll', this)

        $(window).scroll(function() {
            this.checkScroll();
        });
    },

    checkScroll: function() {
        console.log('checkScroll');
    }
});
4

3 回答 3

4

是的,试试这个:

initialize: function() {
    _.bindAll(this, 'checkScroll');
    $(window).scroll(this.checkScroll)
},

_.bindAll将获取this.checkScroll并将其上下文修复为this,因此您可以直接将其作为处理程序传递。但是你使用匿名函数把它扔掉了。

请注意,有两种不同的“绑定”概念:

  • 将函数绑定到对象,这样无论函数如何调用,它都会有固定的this
  • 将处理程序附加到元素的事件

_.bindAll前者。


jsfiddle 演示

于 2012-07-06T14:07:09.497 回答
1

尝试:

var view = this; //add this
$(window).scroll(function() {
    view.checkScroll(); //change "this" to "view"
});
于 2012-07-06T14:07:39.620 回答
0

您的代码的实际问题是丢失this. 通过删除内联函数并提供对该函数的直接引用,您可以避免在闭包时丢失上下文。

但是,如果您仍想使用内联函数或执行一系列函数,您仍然可以使用相同的代码,使用公开适当上下文的代理包装函数。

您必须代理该功能并为其提供适当的范围:

使用下划线

$(window).scroll(_.bind(function() {
    this.checkScroll();
    this.anotherFunction();
},this));

使用jQuery

$(window).scroll($.proxy(function() {
    this.checkScroll();
    this.anotherFunction();
},this));
于 2014-03-03T10:55:05.223 回答