Клуб API Карт

Загрузка содержимого балуна через Ajax в кластеры LoadingObjectManager

mynovosel
19 ноября 2016, 23:06

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

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

Вот один из вариантов, который я пробовал:

var LOM = new ymaps.LoadingObjectManager('/map.php?cat='+cat+'&bbox=%b',{clusterize: true,clusterHasBalloon:true,geoObjectOpenBalloonOnClick:true});
mmp.geoObjects.add(LOM);

var monitor;
function hasBalloonData (objectId) {
    return LOM.objects.getById(objectId).properties.balloonContent;
}
LOM.objects.events.add('click', function (e) {
    var objectId = e.get('objectId');
   LoadBalloon(objectId);
});
LOM.clusters.events.add('balloonopen', function (e) {
    var target = e.get('target').getOwner(),
        activeObject = target.state.get('activeObject');
  if (monitor) {
        monitor.removeAll();
  }
  monitor = new ymaps.Monitor(target.state);
  monitor.add(['activeObject'], changeActiveObject);
  changeActiveObject({
      activeObject: activeObject
  });
});
function changeActiveObject (data) {
    var id = data.activeObject.id;
    if (!hasBalloonData(id)) {
        LoadBalloon(id);
    }
}
function LoadBalloon(id){
    if (hasBalloonData(id)) {
        LOM.objects.balloon.open(id);
    } else {
        SetBaloon(id);
    }
}
function SetBaloon(id){
    var obj = LOM.objects.getById(id);
   $.ajax({
        url: '/map.php?bln='+id
    }).done(function(data) {
        obj.properties.balloonContent=data;
    });
}

Балуны в одиночные метки загружаются нормально. Кластерные балуны сначала открываются, потом в них загружается и не обновляется контент. Показывается он только если щёлкнуть по другой метке, а затем открыть ранее загруженную.

Впрочем, наверное, правильнее загружать содержимое балунов для всех меток кластера. Как это сделать тоже не понятно. Нашел такой рабочий пример: http://jsfiddle.net/rx3LF/1/ однако в нем используется не LoadingObjectManager, а clusterer, и адаптировать его под кластеры LOM не удалось. :(

Вопросы:

1. Как заставить код отображать содержимое балуна сразу после загрузки данных в приведённом выше примере?

2. Как правильно организовать перебор всех меток, входящих в данный кластер LoadingObjectManager чтобы сформировать единый запрос на загрузку данных для этих меток?

LOM.clusters.events.add('click', function (e) {
	var obj = e.get('target');
	var objectId = e.get('objectId');
	//Получили нужный кластер и его ID
	//Как получить массив ID меток кластера?
	...
});

Спасибо!

1 комментарий
Подписаться на комментарии к посту
https://yandex.ru/blog/mapsapi/objectmanager-balun-klastera-i-zagruzka-dannykh-po-trebovaniyu