Клуб API Карт

Инициализация объекта карты, проблема видимости переменной

Пост в архиве.
delphikingdom
19 сентября 2013, 17:19

Всем доброго дня.

У меня следующая проблема: карта заполняется данными из динамического YML-файла.


Сначала делала так:

var mapYandex;

ymaps.geoXml.load(url).then(function (res)
{
    mapYandex = new ymaps.Map(document.getElementById('map'), {
         center: res.geoObjects.get(0).geometry.getCoordinates(),
...

}

Но в таком варианте мне более не доступна переменная объекта карты (mapYandex ). Работа страницы предусматривает дальнейшую манипуляцию с картой. Я так понимаю, что переменная mapYandex не видна вне функции load.

Если вынести инициализацию карты из функции загрузки файла, то при создании её необходимо инициализировать с координатами центра, но мне они неизвестны. Сделала так:

mapYandex = new ymaps.Map(document.getElementById('map'), {
center: [55.763969, 37.592111],
zoom: 13,
type: 'yandex#map'});

....
ymaps.geoXml.load(url).then(function (res)
{
     mapYandex.geoObjects.add(res.geoObjects);
    ...

}

 

Все работает, но в первый момент видно, как карта позиционируется и затем перерисовывается в новых координатах. Этот "прыжок" несколько раздражает. Есть ли возможность решить эту задачу более элегантным способом?

6 комментариев

 

Но в таком варианте мне более не доступна переменная объекта карты (mapYandex ). Работа страницы предусматривает дальнейшую манипуляцию с картой. Я так понимаю, что переменная mapYandex не видна вне функции load. 

 

Вы неправильно понимаете.

Переменная доступна, но инициализируется только после того как придет ответ от обработчика load (асинхронно)

Наглядная демонстрация: 

 

var mapYandex;

ymaps.geoXml.load(url).then(function (res) {    // Этот код выполнится позже чем тот что после обработчика    mapYandex = new ymaps.Map(...)
});
console.log(mapYandex); // undefined, т.к. ответ еще не пришел

 

Вы можете использовать функцию обратного вызова

Пример:

 

function createMapFromUrl(url, callback) {    ymaps.geoXml.load(url).then(function (res) {        callback(new ymaps.Map(...));    });}

Использовать так:

 

createMapFromUrl('http://_url_', function (map) {
    // тут весь код, что работает с map 
});

 

Спасибо за совет!
Я, на самом деле, похоже не понимаю каких-то важных нюансов.

Дело вот в чем, у меня загружается карта при загрузке страницы. На самой странице есть еще элементы управления, с помощью который пользователь будет перемещать или обновлять карту. Именно эту самую карту с ранее загруженными точками. То есть к объекту карты я обращаюсь не в том скрипте, где её загружаю, а позже, когда карта уже загружена, по определенному действию пользователя.
Поэтому я сделала объект карты глобальной переменной, чтобы в любой момент иметь к ней доступ.
Если я не ошибаюсь, в предложенном варианте инициализированная карта опять таки не будет мне доступна.
К сожалению не могу показать ссылку на страницу, там сейчас все "развалено".

Вы можете назначить карту глобальной переменной внутри обработчика callback

А есть возможность точно узнать, закончена загрузка или нет?

Есть. Загрузка закончена когда будет вызван callback

Спасибо за помощь!
И самое главное, за терпение :)