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 方法没有“找到”。

未捕获的 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 回答