2

クラスの作成にはClass.jsを使用しています。

コールバック関数から呼び出されたときに、メソッド内で正しいコンテキストを取得できません

私のコードは

WordCloud = MyClass.extend({
    init: function(data) {
        var me = this;
        (......).on("onComplete", this.draw);
    },
    show: function(word) {
        alert(word)
    },
    draw : function(words){
        console.debug(this); // prints element that triggred `onComplete` action
        console.debug(words); // "Hi"
        console.debug(me); // me is not defined
        me.show(words) // Need to call this method
    }
});

問題はdraw、アクションが完了したときにメソッドが起動されることですが、内部のdrawメソッドthisは実際のclassインスタンスではなく、コールバック アクションをトリガーした要素です。

this.drawこれはコールバック関数であり、パラメーターが 1 つしかないため、呼び出し中に追加の引数を渡すことはできませんonComplete

showからメソッドを呼び出すにはどうすればよいdrawですか?

4

2 に答える 2

3

Internet Explorer 8 以下をサポートする必要がない場合は、bind()を使用できます。

init: function(data) {
    var me = this;
    (......).on("onComplete", this.draw.bind(this));
}

それ以外の場合、既に jQuery を使用している場合は、同じように機能する$.proxy()を利用できます。

init: function(data) {
    var me = this;
    (......).on("onComplete", $.proxy(this.draw, this));
}
于 2013-02-18T15:01:02.483 に答える
1

これらの場合にはヘルパー関数を使用します。

function hitch(obj, func) {
    return function() {
        return obj[func].apply(obj, arguments || [])
    };
}

それを呼び出すには、hitch(this, 'draw');の代わりに使用しますthis.draw

または、さらに簡単にするために、単純化されたバージョンを基本クラスに追加できます

function hitch(func) {
    var that = this;
    return function() {
        return that[func].apply(that, arguments || [])
    };
}

そして、電話するだけthis.hitch('draw');です。

于 2013-02-18T14:59:28.680 に答える