0

我正在尝试为 Garmin DeviceControl 浏览器插件创建一个 Google 地球控制器。我正在围绕现有的 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 存在。在我的原型 js 类之外运行代码也会产生所需的结果。在我的原型类中发生的事情是 GEinitCallback 永远不会执行。我收到“调用创建”警报和“完成创建实例”警报,但从未出现“初始化调用”警报。我没有 javascript 错误。

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

4

1 回答 1

1

您的作用域有问题 - 每次您遇到回调时,都有可能失去this. 尝试使用bind()on 回调来定义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) {
    }
});
于 2014-04-16T14:03:12.790 回答