2010-07-14 52 views
0

我想要显示infowindow,每个多边形都有自己不同于excel表格的内容,但是我的代码显示了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

您有在addListener方法a very common closure problem

变量从addListener方法click回调被调用时封闭在一个封闭共享同一个环境,所以,循环将已经走完了其历程和变量sbsccfhlatlon将指向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的文章作一简要介绍:

相关问题