1

我正在为 android 创建一个 phonegap 应用程序。我对 Javascript 不是很熟悉,并且遇到了一个场景,我有两个函数,一个初始化一个名为“map”的地图,另一个负责显示从地图上的数据库加载的标记列表。

但是我的问题是如何将标记设置为出现在以不同功能启动的地图上?

编辑这是一些代码:

function map() { ... map = new google.maps.Map(document.getElementById("map"), mapOptions);
... }

function markers() { var MarkerType1 = new google.maps.MarkerImage("/android_asset/www/assets/markerType1.png", new google.maps.Size(29.0, 48.0), new google.maps.Point(0, 0), new google.maps.Point(14.0, 24.0) );

var MarkerType2 = new google.maps.MarkerImage("/android_asset/www/assets/markerType2.png", new google.maps.Size(29.0, 48.0), new google.maps.Point(0, 0), new google.maps.Point(14.0, 24.0) );

var geocoder = new google.maps.Geocoder(); var eventList = $('ul#eventList').empty();

var eventPoints = $.ajax({
    type: 'GET',
    url: 'http://www.somedomain.com/loadEvents.php?&jsoncallback=?',
    dataType: 'JSONp',
    timeout: 5000,
    success: function(data) {
        $.each(data, function(i,item){
            if (item.EventType == 1) {                  
                    new google.maps.Marker({
                        position: new google.maps.LatLng(item.latitude, item.longitude),
                        map: this.map,
                        icon: MarkerType1,
                        draggable:false
                    });                      

            } else if (item.EventType == 2) {
                new google.maps.Marker({
                    position: new google.maps.LatLng(item.latitude, item.longitude),
                    map: this.map,
                    icon: MarkerType2,
                    draggable:false
                });
            }
        }
    }
});

}

4

2 回答 2

1

这是一个可变范围的问题。确保map在两个函数之外声明变量。

例如。:

$(function() {
    var map;//outer variable is accessible within both functions.

    function createMap() {
        map = new google.maps.Map({
            ...
        });
    }

    function createMarkers() {
        $.ajax({
            ...
            success: function(data) {
                $.each(data, function() {
                    var marker = new google.maps.Marker({
                        map: map,
                        ...
                    });
                });
            }
        });
    }

    createMap();
    createMarkers();

});

在实践中,如果需要调用地图/标记创建代码以响应未来的某些事件,则只需将其放入函数中。

如果您想在页面加载后立即创建地图及其标记,则可以执行以下操作:

$(function() {
    var map = new google.maps.Map({
        ...
    });

    $.ajax({
        ...
        success: function(data) {
            $.each(data, function() {
                var marker = new google.maps.Marker({
                    map: map,
                    ...
                });
            });
        }
    });
});
于 2012-12-21T16:27:59.217 回答
0

有两种方法可以处理这个问题。一种解决方案是沿着作用域链向上直到标记作用域和映射作用域都是当前作用域的后代,然后实例化变量,因此

   var map;
   var markers;

然后在这些函数中将生成的对象绑定到这些变量。这样,双方都可以通过这些变量访问对方。

另一种方法是使用观察者模式(这里有几个替代方案)在地图和标记准备就绪时发布它们,并在其中一个中拥有订阅者(如您所见)以侦听另一个的准备情况并捕获传递的对象。

不同之处在于方法 1 将地图和标记公开给所有其他后代范围(可能不可取)。

于 2012-12-21T16:19:12.720 回答