Переменные Javascript не распространяются через - PullRequest
1 голос
/ 22 июля 2010

Я использую OpenLayers с Waze (слои Maps) и у меня есть некоторые проблемы с переменными, которые не распространяются.У меня есть этот код:

    var lonlat = new Array(), infodiv = new Array();

    for (var i = 0; i < stations.length; i++)
    {
        if (i == 0)
            icon_temp = icon;
        else
            icon_temp = icon.clone();

        lonlat[i] = new OpenLayers.LonLat(stations[i].lon,stations[i].lat);
        infodiv[i] = "<div style='font-size: 14px;'><strong>" + stations[i].company + "</strong></div>";

        marker = new OpenLayers.Marker(lonlat[i],icon_temp);
        marker.setOpacity(0.8);

        marker.events.register('mousedown', marker, function(evt) {
            popup = new OpenLayers.Popup.FramedCloud(null,
                               lonlat[i],
                               null,
                               infodiv[i],
                               anchor=null,true,null);

            map.addPopup(popup);

            OpenLayers.Event.stop(evt); 

        });

        markers.addMarker(marker);
    }

Код должен перебирать массив станций и добавлять маркеры на карту.Это работает просто отлично!

Проблема в массивах 'lonlat' и 'infodiv'.«OpenLayers.Popup.FramedCloud» их не видит - он возвращается нулевым (проверяется с помощью FireBug).Если я потеряю массив и присваиваю только каждый раз lonlat = ... и infodiv = ... примерно так:

    for (var i = 0; i < stations.length; i++)
    {
        if (i == 0)
            icon_temp = icon;
        else
            icon_temp = icon.clone();

        lonlat = new OpenLayers.LonLat(stations[i].lon,stations[i].lat);
        infodiv = "<div style='font-size: 14px;'><strong>" + stations[i].company + "</strong></div>";

        marker = new OpenLayers.Marker(lonlat,icon_temp);
        marker.setOpacity(0.8);

        marker.events.register('mousedown', marker, function(evt) {
            popup = new OpenLayers.Popup.FramedCloud(null,
                               lonlat,
                               null,
                               infodiv,
                               anchor=null,true,null);

            map.addPopup(popup);

            OpenLayers.Event.stop(evt); 

        });

        markers.addMarker(marker);
    }

он распространяется в функцию FrameCloud и показывается - но тогда проблемаон показывает только последние lonlat и infodiv (как будто он не содержит их копии, но содержит фактические объекты - поэтому каждая итерация 'lonlat' и 'infodiv' заменяется последней информацией).

Как это можно преодолеть?

1 Ответ

3 голосов
/ 22 июля 2010

Это связано с закрытием переменной i.

Введите другую область видимости, например,

(function(i){
marker.events.register('mousedown', marker, function(evt) { 
                    popup = new OpenLayers.Popup.FramedCloud(null, 
                                       lonlat[i], 
                                       null, 
                                       infodiv[i], 
                                       anchor=null,true,null); 

                    map.addPopup(popup); 

                    OpenLayers.Event.stop(evt);  

                });
})(i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...