Клуб API Карт

ObjectManager загрузка данных кластеров через AJAX

patrikfoldes
24 марта 2015, 19:50

Здравствуйте!

 

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

 

Вводные:

Кластеризация идет через objectManager с макетом cluster#balloonAccordion, используется версия API 2.1.23.

 

Задача:

1) подгружать через AJAX при открытии балуна кластера clusterCaption для всех обьектов этого кластера

2) подгружать через AJAX содержимое balloonContent обьекта при раскрытии его в кластере

 

Из разных тем взял код и слепил вот такое решение:

 

objectManagerD.clusters.events.add("balloonopen", function(e){
// Загрузка содержимого активного балуна
activeObjectMonitorD = new ymaps.Monitor(e.originalEvent.currentTarget.state);
activeObjectMonitorD.add('activeObject', function (newValue, oldValue){
if(newValue !== null){
if(newValue.properties.balloonContent == " "){
$.post("/ajax/mapballoon.php", {
id: newValue.properties.i
}, function(data){
/* Обновление данных геообьекта */
objectManagerD.objects.setObjectProperties(newValue.id, {"balloonContent" : data});
});
}
}
});
// Загрузка данных clusterCaption
var geoObjs = objectManagerD.clusters.getById(e.get("objectId")).properties.geoObjects, 
len = geoObjs.length, 
ids_need_name = []; 
while(len--){
if(!geoObjs[len].caption_loaded){
       ids_need_name.push({"yid" : geoObjs[len].id, "id" : geoObjs[len].properties.i});
}
}
if(ids_need_name.length){
$.post("/ajax/mapmarkname.php", {
ids: ids_need_name
}, function(data){
var result = $.parseJSON(data), 
len = result.items.length;
while(len--){
/* Обновление данных геообьекта */
objectManagerD.objects.setObjectProperties(result.items[len].yid, {"clusterCaption" : result.items[len].name});
objectManagerD.objects.getById(result.items[len].yid).caption_loaded = true;
}
});
}
}).remove('balloonclose', function (event) {
activeObjectMonitorD.removeAll();
});

 

Но с этим кодом остаются две проблемы:

1) Данные подгруженные в геообьект в местах помеченных в коде как /*Обновление данных геообьекта*/ отображаются только после закрытия и повторного открытия балуна кластера. Вопрос - как сделать, чтобы данные были видны сразу?

2) Код внутри:

activeObjectMonitorD.add('activeObject', function (newValue, oldValue){
почему-то срабатывает несколько раз при нажатии на cluster caption в балуне кластера, из-за чего запрос на подгрузку через AJAX внутри него тоже триггерится несколько раз. Как сделать, чтобы это событие срабатывало только один раз при раскрытии обьекта?

1 комментарий
Подписаться на комментарии к посту
Добрый вечер. Очень сложно разобраться в коде не в живом примере. Могли бы вы скинуть куда-нибудь полный пример? К примеру, на jsfiddle.net