Клуб API Карт

Не получается открыть балун при использовании кластеризатора

e.infoman
17 октября 2012, 09:04

Когда не использую кластер, балун открывается нормально:

 

this.ymap.setCenter(point.getCoordinates(), zoom, {
            callback: function(error) {
                if (error) {
                    alert('Ошибка!');
                } else {
                    self.__placemarks[point.innerIndex].balloon.open();
                }
            }
        });

как только кладу все точки в кластер:

clusterer.add(placemarks);
this.ymap.geoObjects.add(clusterer);

то, чтобы я не делал, при открытии балуна вознкиает ошибка в связи с тем, что getMap() у балуна возвращает bull:

this.ymap.setCenter(point.getCoordinates(), zoom, {
            callback: function(error) {
                if (error) {
                    alert('Ошибка!');
                } else {
                    var placemark = self.__placemarks[point.innerIndex];
                    var state = self.__clusterer.getObjectState(placemark);
                    if (state.isShown) {
                        if (state.isClustered) {
                            state.cluster.state.set('activeObject', placemark);
                            state.cluster.balloon.open(); // тут ошибка
                        } else {
                            placemark.balloon.open(); // и тут ошибка
                        }
                    }
                }
            }
        });

 

Не могу понять, почему так происходит.

 

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

может потому что все объекты не успели кластеризоваться?

ты дождался события objectsaddtomap прежде чем с ним работать?

я, видимо, неправильно понял это событие. Получается, что оно не один раз возникает, а практически на каждое телодвижение?

как тогда нужно сделать, если мне надо центрировать карту по точке и открыть балун? И как быть, если мне нужны разные обработчики на разные причины возникновения objectsaddtomap?

 

Событие возникает в трех случаях:

1. При добавлении кластеризатора на карту.

2. При изменении зума

3. При сдвиге карты, когда в видимую область карты попадают новые объекты.

Первый случай, думаю, понятно как распознавать. А вот отличать вторую и третью ситуацию можно по событию карты boundschange - смотреть, поменялся зум или нет.

Так, а если у меня такая ситуация: есть много объектов на карте + есть список некоторых объектов с карты. При клике на элемент списка я хочу центрировать+зумировать карту и открыть балун.

Если я у карты вызываю map.setCenter(point, 14, { callback: function () {...}});  - тут есть коллбэк. Кроме того, коллбэк есть у кластера. Не могу сообразить, что куда нужно поместить, чтобы добиться нужного мне поведения

в каллбеке у map.setCenter жди пока перестроятся кластера и открывай балун

Блин, супер! Работает!

Я в коллбэке setCenter подписываюсь на событие добавления объектов в кластер (clusterer.events.add('objectsaddtomap', objectsAddedCallback)), выполняю нужные действия и сразу отписываюсь: clusterer.events.remove('objectsaddtomap', objectsAddedCallback);

Спасибо огромное!