Yandex map: динамическая загрузка содержимого балуна
Задача: динамически загружать контент по клику на метку, в т.ч. и при кластеризации
Решение:
Добавим события открытия балуна по клике на метку из карты и кластера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
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), то обновление идёт довольно долго, потому пришлось немножко ограничить загрузку. В хорошем варианте, нужно бы отслеживать клик по заголовку списка в кластере, но это пока не удалось