3
function LolClass(){

    this.init = function(){             
        button_a.bind("tap", function(){                
            this.refreshFields(); // doesn't work 
            //refreshFields(); // doesn't work either
        });     
    }

    this.refreshFields = function(){
        alert("LOL");
    }

    this.dummy = function(){
        this.refreshFields(); // W O R K S!
    }
}

button_aをタップすると、refreshFieldsメソッドが「見つからない」ため、参照エラーが発生します。

Uncaught ReferenceError:refreshFieldsはfile:/// android_asset / www / src / pages / main.js:70で定義されていません

しかし、そのタップリスナー以外の場所でそのメソッドを呼び出すと、機能します。

タップリスナー関数のthis内部がイベントターゲットであるbutton_aを参照していることは間違いありません。

私の質問は:そのための最良の(oo)修正は何ですか?

4

3 に答える 3

8

これを試して

function LolClass(){

    var someVar = 0; 
    var self = this;

    this.init = function(){             
        button_a.bind("tap", function(){                
            self.refreshFields(); // now works!
            //refreshFields(); // doesn't work
        });     
    }

    this.refreshFields = function(){
        alert("LOL");
    }

    this.dummy = function(){
        this.refreshFields(); // W O R K S!
    }
}
于 2012-06-12T17:53:00.783 に答える
4

キャッシュする必要がありますthis

var that = this; // "that" is a convention name for "this"
this.init = function(){             
        button_a.bind("tap", function(){                
            that.refreshFields(); 
        });     
    }
于 2012-06-12T17:53:16.053 に答える
4

コードを変更する必要があります。

function LolClass(){

    var someVar = 0; 
    var $this = this;

    this.init = function(){             
        button_a.bind("tap", function(){                
            $this.refreshFields();
        });     
    }

    this.refreshFields = function(){
        alert("LOL");
    }

    this.dummy = function(){
        this.refreshFields(); // W O R K S!
    }
}

コールバック内の「this」は別のオブジェクトを参照しています。var $ this=this;を追加しました。コールバック内で$thisを使用しました。

于 2012-06-12T17:53:22.323 に答える