2014-10-27 48 views
-1

我有一个JSON对象infoCentros这是我用来构造图,如下所示:标记click事件总是打开到最后推信息窗口

for (var i = 0; i < infoCentros.length; i++) { 
    var centro = infoCentros[i]; 
    var lat = centro.cordenadas.lat; 
    var lon = centro.cordenadas.long; 
    if (lat && lon) { 
     c++; 
     latlon = new google.maps.LatLng(lat, lon); 
     var moptions = { 
      position: latlon, 
      map: $project.gmap 
     } 
     moptions.icon = theme_uri + '/images/marker.png'; 
     var marker = new google.maps.Marker(moptions); 
     $project.mapMarkers.push(marker); 
     google.maps.event.addListener(marker, 'click', function() { 
      $project.mapInfoWindow.setContent(
       '<div class="sescam-info-window">' + 
        '<h3>' + centro.nombre + '</h3>' + 
        '<p>' + centro.lugar + '</h3>' + 
        '<p>Coordinador</p>' + 
        '<p>' + centro.coordinador.nombre + '</p>' + 
        '<p>' + centro.coordinador.email + '</p>' + 
        '<p>Responsable</p>' + 
        '<p>' + centro.responsable.nombre + '</p>' + 
        '<p>' + centro.responsable.email + '</p>' 
       + '</div>' 

      ); 
      $project.mapInfoWindow.open($project.gmap, marker); 
     }); 
     $project.mapBounds.extend(latlon); 
    } 
} 

它似乎做工精细,但如果我有5个标记,无论我点击哪一个,infowindow总是对应最后一项(位置和内容),

任何想法我错过了什么?我认为通过到addListener会做的伎俩..

+1

你需要使用闭包分配内容到infowindow在你的事件监听器中,请参阅https://developers.google.com/maps/documentation/javascript/examples/event-closure – duncan 2014-10-27 11:59:03

+0

@duncan我不明白,你的意思是使用它? 'infowindow.open(marker.get('map'),marker);' – 2014-10-27 12:08:26

+0

不,您对'google.maps.event.addListener'的调用应该使用外部函数而不是匿名内联函数。 – duncan 2014-10-27 14:34:50

回答

1

问题与google.maps.event.addListener的第三个参数有关。该匿名函数包含父级作用域中的变量,当使用标记点击进行评估时,该变量将始终使用分配的最后一个值。寻找关闭更多细节。然而,你可能能够通过使用“bind” javascript函数原型如下方式的功能获得所需的行为:

//inside for loop 
    google.maps.event.addListener(marker, 'click', handleMarkerClick.bind(undefined, marker, i)); 
//other codes if any... 

定义handleClick

function handleMarkerClick(marker, index) { 
    if (typeof infowindow === 'undefined') { 
     infowindow = new google.maps.InfoWindow({}); 
    } 
    var data = infoCentros[index]//helpful data 
    //create content with dynamic data 
    infowindow.setContent("dynamic content"); 
    infowindow.open(marker.getMap(), marker);//modify as per your requirement 
} 
-1

邓肯是正确的,他意味着你必须附加侦听器以外的for循环。它不是特定于Google地图,它是javascript的工作原理。尝试搜索“javascript闭环for循环”或访问此链接 - Closures in Javascript一个简单的解释。

+1

这应该是加评论,我认为,而不是aswer;除非你把解决的例子,也许? – 2014-10-27 12:30:42

+0

我不能评论答案,直到我达到50代表。但你是对的,所以我稍微改变了我的答案。 – Dan 2014-10-27 16:54:42

相关问题