Клуб API Карт

Ошибка при зумировании и открытии балуна

Lafit
22 марта 2013, 10:36

Используемая версия yandex api: api-maps.yandex.ru/2.0.18/?lang=ru-RU&load=package.full

Есть список меток на карте объединенных в кластеры.

К меткам на карте привязан список с названием меток.

Реализую на клик из списка должен центрироваться нужный placeMark, увеличиваться zoom до заданных значений и открываться balloon.

При клике на balloon карта центрируется, масштаб увеличивается но balloon не открывается, выводится ошибка

TypeError: this._Ki.getMap(...) is null

Если убрать зумирование: то все нормально карта центрируется balloon открывается.

Есть предположение что карта просто не успевает отрисоваться т.е в момент когда пытаюсь открыть
balloon карта еще не готова. Пытался резализовать что то вроде отложенного открытия balloon
навешивания на placemark соыбтия parentchange(оказалось самым подходящим) проверки на пустую
карту и открытия но работает через раз а иногда и не работает. Конечно бы идеальным было бы найти
событие что-то вроде полной отрисовки карты но не нашел.
Вот часть кода:
var mapZoom = 14;
var mapZoomForCompany = 16;
placeMark = getPlaceMarkById(idCompany);
setMapZoom(mapZoomForCompany);
setMapCenter(placeMark.geometry.getCoordinates());
checkNeedBalloonOpen();
placeMark.balloon.open();

function setMapZoom(_zoom){
var zoom = _zoom || mapZoom;
yandexMap.setZoom(zoom);
}
function setMapCenter(coords){
yandexMap.setCenter(coords);
}

11 комментариев
Подписаться на комментарии к посту

Тут много чего может быть. Посмотрите пример №2 в документации, в котором показано, как корректно открыть балун на метке, если она в кластеризаторе.

пример посмотрел к сожалению он не помог

Тогда приведите весь код целиком или дайте ссылку на страницу

попробовал немного переписать функции, написал:

yandexMap.setCenter(
            placeMark.geometry.getCoordinates(), mapZoomForCompany, {
                callback: openBaloon(placeMark)
        });

    function openBaloon(placeMark){
        var geoObjectState = companyCluster.getObjectState(placeMark);
        if (geoObjectState.isShown) {
            if (geoObjectState.isClustered) {
                geoObjectState.cluster.state.set('activeObject', placeMark);
                if(!geoObjectState.cluster.balloon.isOpen()){
                    geoObjectState.cluster.balloon.open();
                }
            } else {
                placeMark.balloon.open();
            }
        }

  }

Ошибки перестали валиться, но проблема частично осталось: если происходит зумирование то balloon не открывается если новый зум совпадает с текущим зумом то balloon открывается нормально.

можно посмотреть на этот пример из блога

спасибо за пример. Только есть пара вопросов:

1. Что это за объект PieChartClusterer - описание на него не нашел.

2.Что за метод events.once в IEventManager также не нашел описание этого метода

1. Это пример, которым мы делились в блоге, демонстрирует как отобразить в метке кластера типы объектов, которые он содержит.

Просто написали отдельный класс, расширяющий кластеризатор

2. Да, пока в документацию не добавили. Думаю очевидно что он делает (навешивает обработчик, который сам снимается после первого срабатывания)

Спасибо большое пример очень помог. Основываясь на вашем примере переписал свои функции и все заработало :-)

Метки кластера добавляются на карту асинхронно, нужно слушать событие objectsaddToMap. Долго рассказывать, лучше действительно глянуть пример из блога =)

Спасибо, да, разобрался. Событие objectsaddToMap - это то как раз чего мне не хватало.