2014-03-31 70 views
1

我使用deCarta的JS API PIN事件處理如何將變量傳遞給封閉

我顯示地圖和每個引腳的click事件上的引腳是否被解僱。當我嘗試將引腳ID傳遞給處理程序時遇到了麻煩。它總是顯示加載的最後一個id,不管哪個引腳被點擊。我的代碼聲明的監聽者是:

for (var idx = 0; idx < jsonObjects.devices.length; idx++) { 
    var device = jsonObjects.devices[idx] 
    deCarta.Core.EventManager.listen('click', function() {home.pinPushed(device.id);}, device.pin); 
} 

這是通過所有我顯示的位置循環完成的。它們在各自的座標上正確顯示,並且記錄上一行清楚地顯示每個引腳都使用正確的ID進行聲明。但是,每當我點擊一個引腳上,宣佈最後一個ID是有史以來傳遞給處理程序的唯一ID:

home.pinPushed(device.id) 

如何讓每個引腳通過引腳被點擊時的唯一ID?

回答

1

試試這個:

deCarta.Core.EventManager.listen('click', 
(function(id) { return function(){home.pinPushed(id);}})(device.id), device.pin); 

美化版本:

deCarta.Core.EventManager.listen('click', (function (id) 
{ 
    return function() 
    { 
     home.pinPushed(id); //<---- id here is the closured variable 
    } 
})(device.id), device.pin); 

說明:

Js有一個功能範圍(不牙套({})範圍)。

for迴路是不是創建ANY範圍/功能。

我在做的是爲每個迭代創建執行上下文。

對於每次迭代im發送當前device.id到一個函數,該函數又返回另一個函數關閉該變量。

+0

That works - Fantastic!非常感謝!!!!你會如此善意地簡要解釋爲什麼這會起作用嗎? –

+0

@AndroidAddict編輯。 –