2012-05-11 55 views
4

我有一個位置對象的數組列表,我使用其中一些來構建完整的地址,然後進行地理編碼。一旦我收到OK狀態,我就會在地圖上放置一個標記。這一切工作正常。但是,現在我還想在每個標記上放置一個信息窗口,並在數組列表LocationName中添加另一個屬性。 代碼是在這裏:GMaps JS地理編碼:使用異步地理編碼功能來傳遞變量?

function placeMarkers(myObjList){ 
var geocoder = new google.maps.Geocoder(); 
for(var i=0; i<myObjList.length; i++){ 
    var fullAddress = myObjList[i].Address + ", " + myObjList[i].City + ", " + myObjList[i].State + ", " + myObjList[i].Zip; 
    /* The variable I would like to have access to in the geocode call */ 
    var locationName = myObjList[i].LocationName; 

    geocoder.geocode({ 'address': fullAddress}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      alert(locationName); 
      var marker = new google.maps.Marker({ 
       map: map, 
       position: results[0].geometry.location, 
       clickable: true 
      }); 
      markers.push(marker); 
     } else { 
      alert("Geocode was not successful for the following reason: " + status); 
     } 
    }); 
} 
} 

警報是隻看到LOCATIONNAME是什麼,當我得到這一地位確定。但在測試中,它總是具有相同的價值。一旦我可以定製這個以反映每次正確的值,那麼我就有了排列的代碼來將信息窗口放在標記上。

任何幫助將不勝感激!

回答

4

最簡單的事情可能是在循環中創建一個本地範圍塊,以便每次添加委託/匿名函數以進行地理編碼時,locationName實際上指的是不同的變量。將var放置在循環中並不會創建變量的新實例,因此var聲明基本上會移至封閉範圍塊的頂部。

for(var i=0; i<myObjList.length; i++){ 
    var fullAddress = myObjList[i].Address + ", " + myObjList[i].City + ", " + myObjList[i].State + ", " + myObjList[i].Zip; 
    //begin scope block 
    (function(){ 
     var locationName = myObjList[i].LocationName; 
     var yourObject = myObjList[i]; 
     //etc. 
     geocoder.geocode(...); 
    //end scope block 
    })(); 
} 

編輯:

或者,如果你使用一些框架/,使您可以通過一個匿名函數爲陣列中的每個項目執行代碼,你會得到那樣的範圍界定問題所採取的照顧你的自動。

+1

即時通訊仍然困惑這個概念@。@ – Sherlock