0

我正在使用 javascript 为小型个人项目制作自定义对象,主要用于平板电脑(但也用于笔记本电脑)。该对象处理谷歌地图、gps 跟踪以及其他程序。在对象内部,我定义了要从对象(enableGps, disableGps)外部调用的耦合函数。在 enableGps 内部,我开始跟踪,同时使用外部 error_handler 和内部对象函数 ( this.handleGps) 处理 gps 数据(纬度、经度、精度等)。在this.handleGps我尝试调用this.updateGpsMarker函数来更新地图上的实际标记但抛出异常。

未捕获的类型错误:对象 [对象窗口] 没有方法“updateGpsMarker”

我该如何this.updateGpsMarker打电话this.handleGps?请注意,我需要this.updateGpsMarker作为从外部调用的函数可用(长解释)我将抛出代码只是为了更清楚地说明我想要做什么。

function RouteAssistant(mapCanvas, mapOptions)
{
    // Google mapping and geocoding
    this.map = new google.maps.Map(mapCanvas, mapOptions);
    this.geo = new google.maps.Geocoder();
    this.gpsMarker = null;

    this.updateGpsMarker = function(lat, lon)
    {
        console.log("Updating GPS marker");
        if (this.gpsMarker == null)
        {
            console.log("GPS Marker not created. Creating GPS marker at " + lat + "," + lon);
            this.gpsMarker = new google.maps.Marker(
            {
                position: new google.maps.LatLng(lat,lon),
                map: this.map,
                title: "I am here!"
            });
            this.map.setCenter(new google.maps.LatLng(lat,lon));
        }
        else
        {
            console.log("GPS Marker created. Updating GPS marker to " + lat + "," + lon);
            this.gpsMarker.setPosition(new google.maps.LatLng(lat,lon));
        }
    }

    // GPS and tracking
    this.gpsProcess = null;
    this.enableGps = function (handle_errors)
    {
        if (this.gpsProcess == null) {
            console.log("Enabling GPS");
            this.gpsProcess = navigator.geolocation.watchPosition(this.handleGps, handle_errors);
        }
    };
    this.disableGps = function()
    {
        if (this.gpsProcess != null)
        {
            console.log("Disabling GPS");
            navigator.geolocation.clearWatch(this.gpsProcess);
            this.gpsProcess = null;
        }
    };
    this.handleGps = function(position)
    {
        this.updateGpsMarker(position.coords.latitude, position.coords.longitude);
    }
}
4

1 回答 1

0

可能您可以使用诸如显示模数模式之类的东西来创建一个干净的对象,然后将所有功能放入其中。例如

 var routeAssistant = function(mapCanvas, mapOptions) {

     var map = new google.maps.Map(mapCanvas, mapOptions).
     updateGpsMarker = function(lat, long) {
         //You can directly access 'map' here.
     };
     return {
      updateGpsMarker : updateGpsMarker
     }; 
 };

然后你可以通过这样做来使用它

  var myObject = new routeAssistant(mapCanvas, mapOptions);
  myObject.updateGpsMarker(latitude,longtitude);   
于 2012-07-10T01:16:51.837 回答