Последнее информационное окно отображается для всех полигонов в массиве - PullRequest
0 голосов
/ 14 июля 2010

Я хочу показать информационное окно, в котором каждый полигон имеет свое собственное различное содержимое из листа Excel, но мой код показывает то же информационное окно, содержащее содержимое последней строки Excel со всеми полигонами

Пожалуйста, кто-нибудь может решить эту проблему? Заранее спасибо.

for(m=0; m < array.length; m++)
{
   var lat = array[m][1];
   var lon = array[m][2];
   var latOffset = 0.5;
   var lonOffset = 2;
   var latOffset2 = 0.5;
   var lonOffset2 = 2;
   var polygon = new GPolygon([
     new GLatLng(lat , lon ),
     new GLatLng(lat - latOffset2, lon + (lonOffset-1)),
     new GLatLng(lat - latOffset2, lon - (lonOffset-1)),
     new GLatLng(lat , lon ),
   ], "#ff0000", 0.1 , 0.9, "#ff0000", 0.9);

   a=array[m][1];
   b=array[m][2];
   c=array[m][0];
   f=array[m][3];
   h=array[m][4];
   s=array[m][6];
   bsc=array[m][5];

   GEvent.addListener(polygon, "click", function(overlay,lat,lon) 
   {
      map.openInfoWindowHtml(overlay,"Site"+ s +"<br>"+"BSC"+ bsc +"<br>"+"Cell"+ c +"<br>"+"Cell lattitude"+ lat +"<br>"+"Cell longitude" + lon + "<br>"+"Freq"+ f +"<br>"+"Height"+ h );});  

      map.addOverlay(polygon);
   }
}

1 Ответ

1 голос
/ 14 июля 2010

У вас очень распространенная проблема закрытия в методе addListener.

Переменные, заключенные в замыкание, совместно используют одну и ту же среду, поэтому к моменту вызова обратного вызова click из метода addListener цикл будет работать и переменные s, bsc, c, f, h, lat и lon будут оставлены, указывая на значения последнего элемента в array.

Вы можете решить эту проблему с помощью еще большего числа замыканий, используя фабрику функций:

function makeInfoWindowEvent(map, overlay, s, bsc, c, lat, lon, f, h) {  
   return function() {  
      map.openInfoWindowHtml(overlay,
                             "Site"+ s +"<br>"+"BSC"+ bsc +"<br>"+
                             "Cell"+ c +"<br>"+"Cell lattitude"+ lat +"<br>"+
                             "Cell longitude" + lon + "<br>"+"Freq"+ f +"<br>"+
                             "Height"+ h );
   };  
} 

// ...

for(m = 0; m < array.length; m++) {

  // ...

   GEvent.addListener(polygon, "click", 
      makeInfoWindowEvent(map, polygon, s, bsc, c, lat, lon, f, h)
   );
}

Это может быть довольно сложной темой, если вы не знакомы с тем, как работают замыкания. Вы можете ознакомиться со следующей статьей Mozilla для краткого введения:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...