2009-05-06 15 views
5

Tengo algunos problemas con Google Maps/Javascript. Creo que sé cuál es el problema, pero no sé cómo hacerlo.Google Maps Problema: cierres y pasos por referencia

Un ejemplo de mi problema es here. Cualquiera que sea el marcador en el que haga clic, aparecerá el segundo. Obviamente estoy pasando la información incorrecta a mi oyente del evento, pero parece que no puedo obtener el código correcto. Aquí está una parte reducida de la código:

En primer lugar, he aquí una parte de mi código:

if (GBrowserIsCompatible() && mapResults != null) { 
    // Read in the JSON 
    var mapDetailsArray = loadJSON(); 

    // Create a map 
    var map = new google.maps.Map2(document.getElementById(elementId)); 
    map.setCenter(new google.maps.LatLng(mapDetailsArray[0].getLatitude(), 
     mapDetailsArray[0].getLongitude()), 13); 
    map.addControl(new google.maps.SmallMapControl()); 

    // Add the points and center 
    var mgr = new google.maps.MarkerManager(map); 
    var bounds = new google.maps.LatLngBounds(); 
    for (var i = 0; i < mapDetailsArray.length; i++) { 
    var mapDetails = mapDetailsArray[i]; 

    var point = new google.maps.LatLng(mapDetails.getLatitude(), mapDetails 
     .getLongitude()); 
    bounds.extend(point); 

    // Create our marker 
    var marker = new google.maps.Marker(point); 

    // What action do we use to show the hover 
    var infoAction = "mouseover"; 

    marker.value = mapDetails; 

    google.maps.Event.addListener(marker, infoAction, function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }); 

    mgr.addMarker(marker, 1); 
    } 
    mgr.refresh(); 
} 

"marker.value" siempre termina conjunto como el último valor de lo que era mapDetails. En todo caso, espero que esté "indefinido", ya que una vez que el ciclo ha terminado, ¿no debería ese valor desaparecer de todos modos? Probé varios valores diferentes (por ejemplo, marker.value = i + 1;) pero seguirá apareciendo como el mismo valor para ambos puntos.

¿Alguien tiene alguna idea de cómo puedo pasar los valores correctos al detector de eventos?

Respuesta

6

cambiar esta situación:

google.maps.Event.addListener(marker, infoAction, function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }); 

a esto:

google.maps.Event.addListener(marker, infoAction, (function(marker, point, map) { return function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }})(marker, point, map)); 

Esto creará el cierre que desea.

Dividir a cabo para mayor claridad:

var f = function(marker, point, map) 
{ 
    return function() 
    { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    } 
} 

google.maps.Event.addListener(marker, infoAction, f(marker, point, map)); 
+0

Que hizo el truco. Saludos Greg. Intenté algo así antes, pero sin la función de retorno() {...} envolviendo el código. –

+0

He tenido el mismo problema y he usado la misma solución. Realmente siento que esto es un error en Javascript. – SingleNegationElimination

+0

No creo que sea un error, simplemente no es muy intuitivo – Greg

3

La respuesta anterior no es muy intuitivo, aunque - como dijo Greg.

Cuando agrega un evento a un objeto, ese objeto se transfiere para que pueda acceder a él mediante "esto" dentro del cierre. Si reemplazó "marker.value" con "this.value", su problema se habría resuelto. Si necesita transmitir más cosas, la ata al objeto y pasa hacia abajo:

marker.a = 1 
marker.b = 2 
marker.c = 3 

dentro del cierre this.a será 1 y así sucesivamente ..