我的代码是这样的:
function algolia_search(position) {
clearOverlays();
var APPLICATION_ID = 'PSH...VAKL';
var SEARCH_ONLY_API_KEY = '2eb...efa8';
var INDEX_NAME = 'entities';
var PARAMS = { hitsPerPage: 150 };
// Client + Helper initialization
var algolia = algoliasearch(APPLICATION_ID, SEARCH_ONLY_API_KEY);
var algoliaHelper = algoliasearchHelper(algolia, INDEX_NAME, PARAMS);
// Map initialization
algoliaHelper.on('result', function(content) {
renderHits(content);
var i;
// Add the markers to the map
for (i = 0; i < content.hits.length; ++i) {
var hit = content.hits[i];
var infowindow = new google.maps.InfoWindow({
content: hit.name
});
var marker = new google.maps.Marker({
position: {lat: hit._geoloc.lat, lng: hit._geoloc.lng},
map: map,
label: hit.name,
animation: google.maps.Animation.DROP,
index: i
});
marker.addListener('click', function() {
infowindow.open(map, marker);
});
addListenerOnPoint(marker);
markers.push(marker);
infos.push(infowindow);
}
});
function renderHits(content) {
$('#container').html(JSON.stringify(content, null, 2));
}
algoliaHelper.setQueryParameter('aroundRadius', 200);
algoliaHelper.search();
}
现在标记工作得非常好,但信息窗口却没有。无论我点击哪个标记,它都会显示一个标记的信息窗口,但我不知道如何解决它。
答案 0 :(得分:2)
infowindow会向您显示来自一个标记的数据,因为当您点击它们时,它们会调用:
infowindow.open(map, marker);
在点击它们时,您是否认为infowindow
,map
和marker
的值分别为?
您的假设是,当for循环正在运行时,他们将保留您设置 的值 。
当您点击标记时, for循环已完全运行 。 infowindow
和marker
的值恰好会设置为for循环的最后一个值。
解决方法是找到一种方法来封装循环的每次迭代的数据,这些迭代将在调用侦听器时持续存在。
执行此操作的两种方法是使用ES6块作用域let
而不是var
或使用n IIFE(立即调用函数表达式)来封装infowindow
和{的状态{1}}循环的每一步。
使用
marker
:let
上述作品因为有效发生的是一个新的 为每个
for(i = 0; i < content.hits.length; ++i) { // rest of code above --^ let infowindow = new google.maps.InfoWindow({content: hit.name}); let marker = new google.maps.Marker({...}); marker.addListener('click', function() { infowindow.open(map, marker); }); // rest of code below --v }
和infowindow
变量创建变量 每次迭代, 几乎就像为每次迭代创建一个新的可修改名称 (marker
,marker0
等)< / p>
使用IIFE:
marker1