2010-07-22 4 views
1

Waze (지도 레이어)가있는 OpenLayers를 사용 중이며 전파하지 않는 변수에 몇 가지 문제가 있습니다. 코드 : var lonlat = new Array(), infodiv = new Array();Javascript 변수가 전파되지 않음

  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); 

      } 

코드는 'stations'배열을 반복하고지도에 마커를 추가해야합니다. 그것은 잘 작동합니다!

문제는 'lonlat'및 'infodiv'배열에 있습니다. 'OpenLayers.Popup.FramedCloud'는 그들을 보지 못합니다 - null로 반환됩니다 (FireBug를 사용하여 검사 됨). 나는 배열을 잃고에만이 같은 때마다 lonlat = ... 그리고 infodiv = ...을 할당하는 경우 :

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); 

      } 

는 FrameCloud 기능에 propogated되고 있으며 표시되고

- 문제 다음하지만 마지막 lonlat과 infodiv 만 보여줍니다 (마치 사본을 보유하지 않고 실제 객체를 보유하고있는 것처럼 - 모든 반복 'lonlat'및 'infodiv'가 최신 정보로 대체됩니다).

어떻게 해결할 수 있습니까?

감사합니다, 로마

답변

3

이 i 변수의 폐쇄 때문이다.

같은 다른 범위를 소개

,

(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

정말 좋아! 감사! 함수 (i)를 레지스터 부분 (함수 (evt) 근처)에 넣었습니다. 감사!!! – Roman

+0

대단히 고마워, 나는 똑같은 문제가 있었고 나는 미쳐 가고 있었다. 나는 폐쇄 누출에 대해 생각해 본 적이 없었을 것입니다. – ogrisel

+0

Upvote이 코드는 정확히이 시나리오와 OpenLayers를 사용하여 성가신 두통을 해결했습니다. 실제로 코드에서 클로저 문제를 찾을 수는 없습니다. – Jeff

관련 문제