Как создать закрытие для события Bing Maps? - PullRequest
1 голос
/ 14 сентября 2011

У меня проблема с javascript, которая, по моему мнению, связана с замыканиями в циклах, подобных:

Как скопировать переменную в JavaScript? Закрытие JavaScript внутри циклов - простой практический пример

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

monumentMap.plotData = function() {
        monumentMap.theMap.entities.clear();

        var monument = null
        var loc = null;
        for (var i = monumentMap.theData.length - 1; i >= 0; i--) {
            monument = monumentMap.theData[i];
            loc = new Microsoft.Maps.Location(monument.lat, monument.lon);

            // construct a bing pushpin and add it to the item data
            monument.pin = new Microsoft.Maps.Pushpin(loc, {
                icon: 'http://media.maps101.com/' + monument.pinImg
            });

            // construct a bing infobox and add it to the item data
            monument.infobox = new Microsoft.Maps.Infobox(loc, { // breakpoint 1
                title: monument.title,
                offset: new Microsoft.Maps.Point(-3, monument.pin.getHeight() - 5),
                zIndex: 999,
                visible: true
            });

            // add event listeners
            // doesn't work
            Microsoft.Maps.Events.addHandler(monument.pin, 'mouseover', function() {
                return function(infobox) {
                    monumentMap.displayInfobox(infobox);
                }(monument.infobox); // breakpoint 2: by the time this is executed monument.infobox is already "last not current"
            });

            // add the entities to the map view for this item
            monumentMap.theMap.entities.push(monument.pin);
        }
}

Мне трудно понять, почему это не работает. Я установил памятник выполняется до тех пор, пока не сработает событие) он ссылается на последний созданный мной информационный блок, а не на информационный блок, который я прикрепил к этому контакту при подключении обработчика события.

К этому моменту я наполовину ожидаю строку attributeMap.theMap.entities.push (museum.pin); , чтобы добавить связку копий последнего вывода в цикле, но это не так , Он работает так же, как и должен, и добавляет каждую булавку к каждой итерации цикла.

1 Ответ

1 голос
/ 14 сентября 2011

Вам необходимо поместить параметр во внешнюю анонимную функцию. Если я прав:

Microsoft.Maps.Events.addHandler(monument.pin, 'mouseover', 
(function(infobox) {
  return function() {
    monumentMap.displayInfobox(infobox);
  }     
 })(monument.infobox));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...