Клуб API Карт

Как поймать событие добавления балуна на карту?

kir9990
31 июля 2014, 15:56

 

    var map = new ymaps.Map(jQobj[0], { center: [55.753994, 37.622093], zoom: zoom, controls: ['zoomControl',  'fullscreenControl'] });
for (var i=0; i < points.length; i++) {
        var objects = ymaps.geoQuery(ymaps.geocode("Россия, " + points[i].address, { results: 1 }))
            .setOptions("point", points[i])
            .slice(0, 1)
            .addToMap(map);
    }

Метки на карту добавляются по геокодированию. Мне необходимо после добавления на карту последнего балунавыровнять границы видимой области и, соотвественно, выставить новый центр карты.

 

В коде нашёл несколько fire:

 

datachange

optionschange

add

set

create

update

ready

enable

overlaychange

resultshow

load

change

addtomap

Впринципе, какое-то из событий может отвечать за добавление объекта на карте. Я сейчас приступлю к опробыванию каждого из этих событий.
Но, если кто-то уже имел дело с подобной проблемой, либо просто знает что сделать с картой или балунами, чтобы происходило автоматическое выравнивание, ну или хотябы как это сделать вручную - прошу помочь.
8 комментариев
Подписаться на комментарии к посту

Если выравнивать нужно сразу после добавления последнего объекта, то, в принципе, ничего отслеживать и не надо. Просто центруете карту сразу после цикла добавления объектов и всё.

Это промайс добавление, соотвесвтенно после цикла карта ещё несколько сотен миллисекунд будет пустой, если не больше. И отловив карту сразу после, я получаю 0 объектов на карте

1. Вы можете отслеживать, когда цепочка промисов выполнится

.addToMap(map).then(function () {

})

 

2. Если вы геокодируете много точек на клиенте, вы очень скоро можете выйти за рамки бесплатных лимитов. Мы рекомендуем геокодировать метки на сервере и кешировать результат http://api.yandex.ru/maps/doc/jsapi/2.1/dg/concepts/geocoding.xml (раздел про множественное геокодирование)

1) к сожалению это какой то баг либо иным магическим образом получается так, что на все 20 объектов отрабатывает then и каждый раз objects возвращает количество результатов 0. А уже когда все then отрабатывают карта заполняется балунами, будто так и надо. Спасибо большое за этот совет, но так это не работает

2) Да, я уже думаю над этим, только
а) на сервере нет и никогда не будет nodejs или иже подобного

б) вопрос вовсе не в количестве запросов от клиента сейчас, а в том, как мне поймать событие добавление балуна на карту в данном случае?

Приведите код, в котором then отрабатывает 20 раз, тогда я смогу что-то подсказать

Я уже привёл код в котором у меня отрабатывается больше 20 объектов. Добавить туда then не составит труда.
А вопрос, я напомню, состоит в том как это сделать правильно, а не как это делаю я. 

Скорее всего вы ставите then внутри цикла, который срабатывает 20 раз, поэтому и метод в then срабатывает тоже 20 раз. Надо просто вынести then из цикла
var map = new ymaps.Map(jQobj[0], { center: [55.753994, 37.622093], zoom: zoom, controls: ['zoomControl',  'fullscreenControl'] }),objects = ymaps.geoQuery([]);for (var i=0; i < points.length; i++) {        var result = ymaps.geoQuery(ymaps.geocode(....)).setOptions(....);    objects = objects.add(result);    }objects.addToMap(map).then(...)

неплохо было бы иметь возможность программировать точки на сервере через php и ruby.
Спасибо за объяснение. Я, если честно, не вижу причин почему ваш вариант должен работать, а вариант с 20 then'ами нет, но обязательно попробую.