0

我有以下代码,并且阅读了这个,我知道它不会工作,因为 getJSON 调用是异步的。我需要如何更改它以便使用全套标记触发 MarkerClusterer 函数?我尝试将 MarkerClusterer 函数放在 getJSON 调用中,但没有运气......

var mcOptions = {gridSize: 50, maxZoom: 9};
var markers = [];

function parse_json(json) {
  if (json.length > 0) {
    for (i=0; i<json.length; i++) {
        var report = json[i];  
        var latLng = new google.maps.LatLng(report.latitude, report.longitude);
        markers[i] = new google.maps.Marker({
            position: latLng, 
            title: report.name + ' ' + report.surf_size_ft_round, 
            url: "/place/"+report.slug 
        });                     

        google.maps.event.addListener(markers[i], 'click', function() {
          window.location.href = markers[i].url;
        }); 
        markers.push(markers[i]);
    }
  } 
}; 


$.getJSON('<%= request.fullpath + ".json" %>', function(stream) {   
if (stream.length > 0) {
  parse_json(stream);
  alert(markers[1].title);  //sanity check - gives result
  }
});   


    alert(markers[5].title);  // sanity check - empty 
var mc = new MarkerClusterer(map, markers, mcOptions);
4

2 回答 2

1

为什么不放这个代码片段:

mc = new MarkerClusterer(map, markers, mcOptions);

在 $.getJSON 的匿名回调函数中?只需var mc;在 $.getJSON 范围之外的某个地方声明就可以在其他地方访问它。

或者,您可以在parse_json函数结束时触发一个事件,侦听该事件,然后在该事件触发时触发另一个创建 MarkerClusterer 对象的函数。看看这个:如何在 JavaScript 中触发事件?

编辑:

在进一步检查您的代码后,我可以看到您将 marker[i] 设置为一个新的 Marker 实例,然后将其推送到同一实例的标记数组上。您可能希望将 markers[i] 设置为新的 Marker 实例,或者您想创建一个var marker,将其设置为新的 Marker 实例,然后推送标记数组。

于 2012-10-10T09:20:58.040 回答
1

也许您需要将它放在作为 $.getJSON 输入的成功函数中?

$.getJSON('<%= request.fullpath + ".json" %>', function(stream) {   
    if (stream.length > 0) {
    parse_json(stream);
    alert(markers[1].title);  //sanity check - gives result
    mc = new MarkerClusterer(map, markers, mcOptions);
  }
});   

alert(markers[5].title);  // sanity check - empty 
于 2012-10-10T09:21:28.440 回答