2014-04-07 28 views
0

我想在Gmap API上實現一個功能,如果縮放大於17,顯示所有標記(否則,只是隱藏它們)。但是,當我編寫如下代碼時,它不起作用。在帶有回調函數的谷歌地圖上放置多個標記

PS:該代碼可能是在語法和結構完全正確的,但它表達了我的意思

// @latlong is an array of tuple (latitude , longtitude) 
// @myMap is the google map object passed to the function 
function placeMarker(myMap , latlon) 
{ 
    for(var i = 0 ; i < latlon.length ; i ++) 
    { 
    myMarker = new google.maps.Marker({ 
     position: new google.maps.LatLng(latlon[i][0], latlon[i][1]) 
    }); 

    google.maps.event.addListener(myMap, 'zoom_changed', function() { 
     zoomLevel = myMap.getZoom()  
     if(zoomLevel >= 17) 
     { 
     myMarker.setMap(myMap) 
     } 
     else 
     { 
     myMarker.setMap(null) 
     } 
    }); 


} 
} 

我只是改變我的代碼:

function placeMarker(myMap , latlon) 
{ 
    for(var i = 0 ; i < latlon.length ; i ++) 
    { 
    myMarker = new google.maps.Marker({ 
     position: new google.maps.LatLng(latlon[i][0], latlon[i][1]) 
    }); 

    (function(myMarker_copy){ 
     google.maps.event.addListener(myMap, 'zoom_changed', function() { 
      zoomLevel = myMap.getZoom()  
      if(zoomLevel >= 17) 
      { 
      myMarker_copy.setMap(myMap) 
      } 
      else 
      { 
      myMarker_copy.setMap(null) 
      } 
     }); 
     }(myMarker)); 


} 
} 

而第二個版本作品。 我知道如何使它工作,但是,我真的不知道它爲什麼工作,爲什麼不工作。也許這與JS的函數閉包或參數傳遞原則有關(我已經檢查了很多引用,但其中一些只是持有不同的想法)。有人能幫我嗎?

真的很感激。

+0

如果latlon變量是一個元組數組,那麼Latlon [0]是一個元組以及latlon [1]。您需要將標記構造函數傳遞給元組值,而不是元組本身。位置:'''position:new google.maps.LatLng(latlon [i] [0],latlon [i] [1])''' – amenadiel

+0

是的,這是一個錯字,我修改了 – Cherish

回答

0

第一個不起作用的示例:有一個全局變量myMarker和許多事件偵聽器,它們最後都在一個標記上運行,並且是在循環中創建的最後一個標記。

確實有效的第二個例子:因爲閉包,每個事件偵聽器接收到它自己的標記變量的本地副本。所以,當事件監聽器被調用時,它具有正確的標記值。

+0

是的,但是我認爲JS會通過引用傳遞myMarkder變量,但不能通過深層複製...所以如果你說這是因爲函數的關閉,那麼參數myMarker_copy應該仍然指向相同的對象 – Cherish

+0

我認爲這種解釋在於函數參數通過值傳遞的事實。儘管對象似乎是通過引用傳遞的。但是它們仍然是通過價值傳遞的。 –

+0

內部函數(在本例中爲事件處理函數)可以訪問函數的參數和變量(函數可以訪問創建它的上下文)。事件處理函數綁定到傳入的對象,而不是在封閉函數外定義的對象。 –