2014-05-20 109 views
0

我正在使用我的數據庫獲取將在Google地圖上設置爲不同位置的標記。我使用JavaScript來還爲所有這些動態加載的標誌事件偵聽器,但我有這個一個問題:動態地在Google地圖上設置活動不起作用

var markerCollection = []; 

//pushing data into the array... 

for (var j = 0; j < markerCollection.length; j++) { 
    console.log(j + ' ' + markerCollection[j].shopId); 
    $.proxy(google.maps.event.addListener(markerCollection[j].gmapMarker, "click", function(e) { 
     console.log(markerCollection[j].shopId); 
    }),this); 
} 

代碼告訴我markerCollection[j]是不確定的。然而,如果我輸入一個硬編碼的方式(markerCollection [0]),它將起作用。爲什麼會發生這種情況,我該如何解決?

+1

如果$ .proxy是一個異步函數,當它執行的時候它會丟失j的值,它不在範圍內 – juvian

+0

@juvian,不使用代理會給出同樣的錯誤。 – user3141607

+1

它會在控制檯日誌或addListener中給出錯誤嗎? – juvian

回答

3

答案中的代碼鏈接在一個評論中比它需要更復雜。有一個這樣更簡單的方式,更容易理解:

var markerCollection = []; 

     //pushing data into the array... 

for (var j = 0; j < markerCollection.length; j++) { 
    addMarker(markerCollection[j]); 
} 

function addMarker(marker) { 
    console.log(marker.shopId); 
    google.maps.event.addListener(marker.gmapMarker, "click", function(e) { 
     console.log(marker.shopId); 
    }); 
} 

這真的是你所需要的。每次調用函數addMarker()時,該函數的調用都有其自己的變量,該變量引用markerCollection數組中的一個元素。而且,當稍後響應點擊而調用偵聽器回調時,變量仍然有效。

它與更復雜的版本做同樣的事情,但以我認爲更容易遵循的方式。請注意0​​中的代碼如何使用變量,而不是每次都必須說markerCollection[i]

此外,你不需要$.proxy()位,除非你需要傳遞一個this值,你不使用這裏。所以,如果你不需要它,請將它放棄。越簡單越好!

+0

非常感謝,這也適用。更具可讀性.. – user3141607