我有以下代码,并且阅读this,我明白它不会工作,因为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);
答案 0 :(得分:1)
为什么不放这段代码:
mc = new MarkerClusterer(map, markers, mcOptions);
在$ .getJSON中的匿名回调函数内?只需在$ .getJSON范围之外的某处声明var mc;
即可在其他位置访问它。
或者,您可以在parse_json
函数结束时触发事件,侦听该事件,然后在事件触发时启动另一个创建MarkerClusterer对象的函数。看看这个:How to trigger event in JavaScript?
编辑:
在检查你的代码之后,我可以看到你将marker [i]设置为一个新的Marker实例,然后推送到同一个实例的markers数组。您可能想要将marker [i]设置为新的Marker实例,或者您想要创建var marker
,将其设置为新的Marker实例,然后按下markers数组。
答案 1 :(得分: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