Клуб API Карт

событие balloonopen для кластера не срабатывает для балуна с несколькими метками

Пост в архиве.

Добрый день!

Я новичок в яндекс картах.

С сервера грузятся координаты и id объектов (всего 3000 примерно). Все это дело помещается в кластер и на карту.

Пользователь "проваливается" до конечной точки и в итоге открывает ее. 

Задача динамически подгрузить содержание объекта уже при фактическом открытии балуна.

 
var myMap = null;
  var clusterer = null;
  ymaps.ready(function(){
   
  myMap = new ymaps.Map('map', {
          center: [55.753676, 37.619899],
        zoom: 10
      });
   
       clusterer = new ymaps.Clusterer({
               preset:'islands#invertedBlackClusterIcons',

            groupByCoordinates: false,
            clusterDisableClickZoom: false
        });
   
    clusterer.options.set(
      {
          gridSize: 80
      });
   
    clusterer.events.add('balloonopen', function (e) {
       
        id=e.get('target').properties.get('id');
        console.log(id);
 // здесь должна отрабатываться динамическая подгрузка
    });    
      myMap.geoObjects.add(clusterer);
      GetGeoObjects(1,5000,false); //динамически грузит координаты точек в формате [{id,latitude,longitude},{..},{..}]
 });

 

Проблема в том что событие balloonopen срабатывает для одиночной метки. Но если открывается балун с несколькомики метками имеющими одинаковые координаты, событие не срабатывает.  Подскажите какое решение лучше применить.

 

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

 

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

Что это значит?

 

Опишите какое поведение нужно реализовать

Нужно чтобы отрабатывался baloonopen когда открывается балун с несколькими метками. Чтобы я мог подгрузить содержание сразу по нескольким метками.

Я пробовал click обрабатывать. Но там непонятно когда срабатывает zoom а когда фактическое открытие балуна с несколькими метками. 

Балун то открывается один.

Все что тут надо сделать это собрать id меток в кластере и подгрузить их данные

Вы не до конца поняли меня.

Например по адресу ул. Ленина д.1  находится 2 банка и 5 банкоматов. У всех одни координаты. При нажатии откроется один балун и в нем будут показаны 7 объектов. Вот это событие не отрабатывается. Но если бы там была одиночная метка то событие отработалось при открытии балуна для одиночной метки.

 

Попробуйте по ссылке которую я привел. лог в консоль записывает.

Да нет это вы не поняли

все там отрабатывает, и событие вызывается,

там просто код падает на этой строчке

id=e.get('target').properties.get('id');

и до вашего console.log(id) дело не доходит.

Можете поставить breakpoint в дебаггере и проверить что событие срабатывает

Все верно. Спасибо. Ступил.

Надо слушать клик, а не balloonopen.

Вот примерно то что вы хотите сделать

http://jsfiddle.net/rx3LF/1/

 Спасибо за ссылку. Я видел этот пример. Мне надо чтобы зум был до последнего уровня и только потом подгрузка. У меня объектов много. Там может 200-300 объектов за раз подгрузиться в этом примере при первом же клике на "группу объектов" в кластере. Время ожидания будет большим.  В моем случае не совсем то что надо.

Как сделать так чтобы "подгрузка" осуществлялась уже на самом нижнем уровне?

И еще ворпрос если можно:

Кусок кода   из вашего примера не работает корректно для события 'balloonopen':

var target = e.get('target'),
          geoObjects = typeof target.getGeoObjects === 'function' && target.getGeoObjects() || [target];
        var ids = jQuery.map(geoObjects, function (obj) {
        return obj.properties.get('id');
        }

ids формируется некооректно из-за obj.properties.get('id') [метод get неопределен]; Хотя для click все корректно работает.

Я попробовал в Вашем примере изменить click на 'balloonopen' и поставил clusterDisableClickZoom: false

Как взять корректный список id-шек в событии balloonopen, или же в событии click понять что будет показан балун?

там похоже в случае "balloonopen" на кластере "target" указывает на менеджер балуна кластеризатора, а при "balloonopen" на геообъекте указывает на геообъект.

 

Вам надо в случае если это кластер, спрашивать e.get('cluster') вместо e.get('target')


var target = e.get('cluster') || e.get('target'),

var target = e.get('cluster')!=null?e.get('cluster'):e.get('target'); решило проблему. Все работает. Спасибо.