Prototype.js回调没有触发

时间:2014-04-16 09:21:28

标签: javascript prototypejs google-earth garmin

我正在尝试为Garmin DeviceControl浏览器插件创建一个Google Earth控制器。我正在模拟现有Google MAPS控制器周围的行为,但我遇到的障碍是我的第二个回调函数没有被触发。

代码:

Garmin.GoogleEarthMapController = function(mapString){}; //just here for jsdoc
Garmin.GoogleEarthMapController = Class.create();
Garmin.GoogleEarthMapController.prototype = {
    initialize: function (mapString) {
        google.setOnLoadCallback(this.GEinit);
    },
    GEinit: function() {
            alert("call create");
            //This is a Google.js function and works when executed outside of prototype
            google.earth.createInstance(this.mapElementName, this.GEinitCallback, this.GEfailureCallback);
            alert("finished create instance");
    },
    GEinitCallback: function (instance) {
                alert("init called");
    },

    GEfailureCallback:function (errorCode) {
    }
}

所有必要的js包含在HTML中,它们都是有效的,目标div存在。在我的prototyped js类之外运行代码也会产生所需的结果。我的原型类中发生的事情是从未执行过GEinitCallback。我得到“call create”警报和“完成的创建实例”警报,但“init called”警报从未出现。我没有javascript错误。

我是否正确指定了回调?如果没有,我怎么样? google.earth.createInstance函数在Google地球源文件中定义,并且位于控制器外部。

1 个答案:

答案 0 :(得分:1)

您的范围有问题 - 每次点击回调时都有可能失去this的定义。尝试使用回调上的bind()来定义函数上下文中的this。我已经注意到下面的电话了。您还可以简化类定义以及

Garmin.GoogleEarthMapController = Class.create({
    initialize: function (mapString) {
        // make sure you bind this call
        google.setOnLoadCallback(this.GEinit.bind(this));
    },
    GEinit: function() {
        alert("call create");
        //This is a Google.js function and works when executed outside of prototype
        //make sure you bind this call
        google.earth.createInstance(this.mapElementName, this.GEinitCallback.bind(this), this.GEfailureCallback.bind(this));
        alert("finished create instance");
    },
    GEinitCallback: function (instance) {
            alert("init called");
    },

    GEfailureCallback:function (errorCode) {
    }
});