Yandex map: динамическая загрузка содержимого балуна
Задача: динамически загружать контент по клику на метку, в т.ч. и при кластеризации
Решение:
Добавим события открытия балуна по клике на метку из карты и кластера:
objectManager.objects.events.add('balloonopen', function (e) {
console.log("Открыт балун вне кластера");
var id = e.get('objectId'),
geoObject = objectManager.objects.getById(id);
downloadContent([geoObject], id);
});
objectManager.clusters.events.add('balloonopen', function (e) {
var id = e.get('objectId'),
cluster = objectManager.clusters.getById(id),
geoObjects = cluster.properties.geoObjects;
console.log("Открыт балун из кластера..");
downloadContent(geoObjects, id, true);
});
....
function downloadContent(obj,id,isCluster){
console.log("Загружаем объект:");
aids = obj.map(function (geoObject) {return geoObject.id;});
if ((obj.length)<200) {
$("#global").addClass("loading");
$.post("?r=inications/get_points_content", {
ids:aids,
}).done(function(data) {
obj.forEach(function (geoObject) {
//console.log("--присваиваем новое тело балуна");
if (geoObject.properties.balloonContentBody.includes("<l></l>")){
//console.log("-подменяю содержимое балуна!");
//console.log(geoObject);
geoObject.properties.balloonContentBody =geoObject.properties.balloonContentBody.replace("<l></l>",data.result[geoObject.id].content);
if (isCluster!==true){
objectManager.objects.balloon.setData(objectManager.objects.balloon.getData());
} else {
objectManager.clusters.balloon.setData(objectManager.clusters.balloon.getData());
};
//setNewData();
}
});
$("#global").removeClass("loading");
});
} else {
ToastMessage("error","Кластер слишком велик","Кластер слишком велик для того чтобы его раскрыть. Увеличьте масштаб и попробуйте снова!",6000);
};
}
К сожалению, если в кластере собрано очень много меток (более 200), то обновление идёт довольно долго, потому пришлось немножко ограничить загрузку. В хорошем варианте, нужно бы отслеживать клик по заголовку списка в кластере, но это пока не удалось