Клуб API Карт

Как правильно открыть балун в поиске?

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

Добавил на карту поиск по своим объектам по аналогии с примером в песочнице (http://api.yandex.ru/maps/jsbox/custom_search) с единственным отличием, что там на карту добавлена геоколлекция, а у меня кластеры. Слушаю событие resultselect (тоже кстати не верно, потому что оно происходит до перехода к метке который разумеется закроет только что открытый балун, а как правильно пока не знаю) и перебираю элементы кластера сравнивая их айдишники Если элемент отображён на данный момент на карте не кластером, а отдельной меткой, то проблем нет, в противном случае не работает. Вообщем в итоге всё доросло до кода ниже и всё равно не работает) Помогите люди добрые советом дельным или примером подходящим.

 

 getState = function (point) {
     return clusterer.getObjectState(point);
 }
 mySearchControl.events.add("resultselect", function (e) {
     Index = e.get("resultIndex");
     mySearchControl.getResult(Index).then(function (result) {
         id = result.properties.get("id");
         clusterer.each(function (item) {
             var state = getState(item);
             cluster = state.isClustered && state.cluster;
             if (cluster) {
                 cluster.properties.get("geoObjects").each(function (item) {
                     if (item.properties.get('id') == id) {
                         cluster.state.set("activeObject", item);
                         cluster.balloon.open();
                     }
                 });
             } else {
                 if (item.properties.get('id') == id) {
                     item.balloon.open();
                 }
             }
         });
     });
 });

 

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

1. Метод each у кластеризатора перебирает не геообъекты, входящие в его состав, а элементы, которые в данный момент добавлены на карту. То есть там будут геообъекты и кластеры (поэтому собственно код и не работает).

2. Правильное решение - проходить по массиву геообъектов, который вы до этого добавляли в кластеризатор. А дальше все так же, как у вас в коде - должно заработать.

Артём Ершов
28 января 2016, 02:15

Пробовал уже...

Без кластеризатора я геообъекты добавлял в массив GeoObjectArray({}, {}); затем его добавлял в геоколлекцию и её уже на карту. Потом методом each этот массив перебирал и открывал нужный балун. Никаких проблем.

В случае же с кластером я не смог добавить такой массив в объект Clusterer. То есть никаких ошибок не выдавал, но объекты на карту тоже не добавлялись. Пришлось добавлять их в обычный массив, а уже его в Clusterer и потом на карту. Всё добавляется, но вот правильно перебрать их так и не выходит

 

А в чем проблема перебрать в цикле элементы обычного массива? :)

Артём Ершов
28 января 2016, 02:15

Ммм.. да) Пожалуй надо порой спать. Ну или думать))

Но всё равно - перебрал forEach нашёл совпадение. Пробую открыть e.baloon.open() на что в логе получаю Uncaught TypeError: Cannot read property 'balloon' of null. Где я ещё косячу?)

UPD: с этим разобрался.  спасибо огромное!

Артём Ершов
28 января 2016, 02:15

Сообразил где неправ был, исправил. Событие только видимо не подходящее для прослушивания выбрал. Когда приходит результат поиска или мы первый раз нажимаем на любой результат из выдачи, то карта масштабируется и центрируется на этом результате - как отловить это событие? resultselect происходит до него и не подходит соответственно.

Артём Ершов
28 января 2016, 02:15

Пусть и с костылём, но проблема решена окончательно.

Поставил параметр noCentering=true, слушаю событие resultselect, по событию перебираю массив и как только совпадение нашлось сам центрирую карту по объекту и ДВАЖДЫ выставляю масштаб. первый раз просто, а во втором колбэком проверяю осталась метка в кластере или нет и тогда уже открываю балун кластера или метки. Если выставляю масштаб один раз, то почему то проверка на нахождение в кластере некорректно работает.

Ладно, я только в начале пути к полному познанию средств, методов и возможностей API. Надеюсь со временем костыли уйдут, а крылья отрастут) Всем добра =)