Клуб API Карт

Подгрузка данных о метках в балун кластера

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

Пытаюсь сделать динамическую подгрузку текста в balloonContentBody геообъекта - на событие click вещаю необходимый мне обработчик. Для отдельного геообъекта проблем нет. Но когда несколько геообъектов имеют одинаковые координаты на карте для них выводится один общий баллун со списком геообъектов (см. рис. ниже) - и невозможно уловить событие click. 

  

 

var myGeoObjects = [];
for (var i = 0; i < coords.length; i++) {
  myGeoObjects[i] = new ymaps.GeoObject({
    geometry: {
      type: "Point",
      coordinates: coords[i]
    },
    properties: {
      clusterCaption: 'Геообъект № '+(i+1),
      balloonContentBody: 'Текст балуна № '+(i+1)
    }
  });
}
var myClusterer = new ymaps.Clusterer(
  {clusterDisableClickZoom: true}
);
myClusterer.add(myGeoObjects);
myMap.geoObjects.add(myClusterer);

 

 


Как можно организовать динамическую загрузку balloonContentBody, когда геообъекты имеют один общий баллун?


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

При открытии балуна на кластере нужно начинать следить за полем state.activeObject кластера. Что-то в таком стиле:

clusterer.events.add('balloonopen', function (e) {

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

         activeObject = cluster.state.get('activeObject');

         loadContent(activeObject);

    cluster.state.events.add('change', function () {

       if (cluster.state.get('activeObject') != activeObject) {

           activeObject = cluster.state.get('activeObject');

           loadContent(activeObject);

       }

    });

});

 

И соответственно по событию balloonclose нужно занулять активный объект и снимать слушателя с cluster.state.

Отлично, то что надо! Единственное что - не получается снять слушателя с cluster.state.

Делаю так

cluster.state.events.remove('change');

но обработчик остается и в итоге при многократном открытии одной метки обработчик вызывается многократно.

в remove нужно передать ссылку на обработчик вторым параметром

Обработчик - анонимная функция

 

cluster.state.events.add('change', function () {

       if (cluster.state.get('activeObject') != activeObject) {

           activeObject = cluster.state.get('activeObject');

           loadContent(activeObject);

       }

    });


Каким образом можно сделать ссылку на нее?

не делайте через анонимную функцию.

благодарю, код работает как часы

В этом примере, которым мы делились в блоге, данные для каждой метки загружаются динамически, при клике на ее имя в списке