2015-01-08 4 views
-1

Голые со мной, когда я объясняю, что означает «память». У меня есть карта Google. Я делаю массив маркеров для карты и добавляю слушателей к каждому маркеру.Интересная проблема с памятью с прослушивателями событий

for(var venue in response.markers){ 
    var loc = new google.maps.LatLng(response.markers[venue].GPSX, response.markers[venue].GPSY); 
    var marker = new google.maps.Marker({ 
     position: loc, 
     title: response.markers[venue].VenueName, 
     map: map 
    }); 

    google.maps.event.addListener(marker, 'click', function() { 
     alert(venue); 
    }); 
    markers.push(marker); 
} 

К тому времени, когда маркер щелкнули, место имеет значение, однако многие вещи там были в response.markers. Как я могу получить слушателя, чтобы предупредить или использовать место первоначального значения, имевшее место на момент его создания? Например, первый маркер должен предупредить 0, второй 1 и т. Д. Благодаря!

ответ

2

После завершения цикла for в JavaScript переменные все еще остаются. Но они настроены на любую ценность, с которой они столкнулись. Таким образом, место является последним пунктом в response.markers, когда функция вызова в конечном итоге вызывается.

Я бы использовал метод bind для функции для создания новой функции с соответствующим аргументом, привязанным в нужное время. Как так:

function alertVenue(venue) { 
    alert(venue); 
} 

for(var venue in response.markers){ 

    // other stuff goes here 

    google.maps.event.addListener(marker, 'click', alertVenue.bind(this, venue)); 
    markers.push(marker); 
} 

Преимущество использования bind в том, что ваш StackTrace будет выглядеть лучше (потому что alertVenue это именованный функция), и это вполне понятно, что происходит, когда вы читаете его.

+0

Определенно работал, спасибо.! – Galway

+0

Нет проблем, если он работает для вас, пожалуйста, не стесняйтесь принять ответ. – aychedee

1

Вы могли бы сделать что-то вроде:

google.maps.event.addListener(marker, 'click', (function(venue) { 
     return function(){alert(venue)}; 
    }(venue))); 

, чтобы избежать закрытия с внешней место,

+0

Работал как шарм! – Galway

Смежные вопросы