2010-07-22 2 views
1

J'utilise OpenLayers avec Waze (couches de cartes) et j'ai quelques problèmes avec des variables qui ne se propagent pas. J'ai ce code: var lonlat = new Array(), infodiv = new Array();Variables Javascript ne se propageant pas à travers

  for (var i = 0; i < stations.length; i++) 
      { 
       if (i == 0) 
        icon_temp = icon; 
       else 
        icon_temp = icon.clone(); 

       lonlat[i] = new OpenLayers.LonLat(stations[i].lon,stations[i].lat); 
       infodiv[i] = "<div style='font-size: 14px;'><strong>" + stations[i].company + "</strong></div>"; 

       marker = new OpenLayers.Marker(lonlat[i],icon_temp); 
       marker.setOpacity(0.8); 

       marker.events.register('mousedown', marker, function(evt) { 
        popup = new OpenLayers.Popup.FramedCloud(null, 
             lonlat[i], 
             null, 
             infodiv[i], 
             anchor=null,true,null); 

        map.addPopup(popup); 

        OpenLayers.Event.stop(evt); 

       }); 

       markers.addMarker(marker); 

      } 

Le code doit parcourir le tableau « stations » et ajouter des marqueurs à la carte. Cela fonctionne très bien!

Le problème est avec les tableaux 'lonlat' et 'infodiv'. Le 'OpenLayers.Popup.FramedCloud' ne les voit pas - il est retourné null (vérifié en utilisant FireBug). Si je perds le tableau et chaque fois que attribuer lonlat = ... et infodiv = ... comme ceci:

for (var i = 0; i < stations.length; i++) { if (i == 0) icon_temp = icon; else icon_temp = icon.clone();

   lonlat = new OpenLayers.LonLat(stations[i].lon,stations[i].lat); 
       infodiv = "<div style='font-size: 14px;'><strong>" + stations[i].company + "</strong></div>"; 

       marker = new OpenLayers.Marker(lonlat,icon_temp); 
       marker.setOpacity(0.8); 

       marker.events.register('mousedown', marker, function(evt) { 
        popup = new OpenLayers.Popup.FramedCloud(null, 
             lonlat, 
             null, 
             infodiv, 
             anchor=null,true,null); 

        map.addPopup(popup); 

        OpenLayers.Event.stop(evt); 

       }); 

       markers.addMarker(marker); 

      } 

il est propogated à la fonction FrameCloud et est affiché - mais le problème est-ce qu'il montre seulement le dernier lonlat et infodiv (c'est comme s'il ne détient pas une copie d'eux mais tient les objets réels - ainsi chaque itération 'lonlat' et 'infodiv' sont remplacés par les dernières informations).

Des idées comment cela peut-il être surmonté?

Merci, Roman

Répondre

3

Cela est dû à la fermeture de la variable i.

Présentez une autre portée comme,

(function(i){ 
marker.events.register('mousedown', marker, function(evt) { 
        popup = new OpenLayers.Popup.FramedCloud(null, 
             lonlat[i], 
             null, 
             infodiv[i], 
             anchor=null,true,null); 

        map.addPopup(popup); 

        OpenLayers.Event.stop(evt); 

       }); 
})(i); 
+0

vraiment génial! Merci! J'ai mis la fonction (i) dans la partie registre (près de la fonction (evt)) et ça a marché! Remercier!!! – Roman

+0

Merci beaucoup, j'avais exactement le même problème et je devenais fou. Je n'aurais jamais pensé à des fuites de fermeture. – ogrisel

+0

Upvote juste résolu un mal de tête ennuyeux avec exactement ce scénario et OpenLayers ... bien que je ne peux toujours pas trouver le problème de fermeture dans mon code. – Jeff

Questions connexes