0

checkScroll()ビューにバインドして、最初に を呼び出すことなく内部からPhotoListView呼び出すことができるようにします。this.checkScroll()$(Window).scroll()var self = thisself.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)
},

_.bindAllthis.checkScrollそのコンテキストを取得して に修正するthisため、ハンドラーとして直接渡すことができます。しかし、匿名関数を使用して破棄しました。

進行中の「バインディング」には 2 つの異なる概念があることに注意してください。

  • 関数をオブジェクトにバインドして、関数がどのように呼び出されても固定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 に答える