Клуб API Карт

Изменить значок кластера при закрытии балуна

Krem-Ilia
10 октября 2016, 12:32

Всем привет.

Имеется карта с множеством объектов, часть из которых идут по одному адресу. Из-за чего возникает необходимость вот такого способа выбора меток: https://yandex.ru/blog/mapsapi/vybrat-obekt-pri-klike-vnutri-ballooncontent

Возник вопрос, есть ли возможность менять значок кластера при закрытии балуна (равно как и при смене объекта). Нашёл, что есть вот такое событие:

objectManager.events.add('balloonclose', event => {});

Однако event.get('target').getData().options там - пустой объект.

В 

objectManager.clusters.state.events.add('change', event => {});

я тоже не могу получить доступ к кластеру и его опциям.

Есть ли такая возможность?

7 комментариев
Подписаться на комментарии к посту
objectManager.clusters.events.add('balloonclose', function (e) {
  objectManager.clusters.setClusterOptions(e.get('objectId'), {iconColor: '#ff0000'})
})
dimik,
спасибо, работает. Только я думал, что iconImageHref будет работать, а такое свойство ничего не делает. Как-нибудь можно именно кастомный значок менять с одного на другой?
Krem-Ilia,
Для своего значка есть опция icons. Посмотрите документацию на ClusterPlacemark
dimik,
и там массив должен быть с описанием? Это тоже ничего не меняет.
Делаю так:


objectManager.clusters.setClusterOptions(e.get('objectId'), {icons: [{href: 'cluster-active.svg']})



У меня получилось решить задачу путём добавления нового ymaps.layout.storage.add('activeClusterLayout'), и его использования в setClusterOptions с помощью iconLayout.


Однако всё равно более простой способ интересен.


Только остаётся проблема - после отдаления карты значок кластера меняется обратно.


Какой вообще правильный способ менять цвет/лейаут метки кластера, если внутри него есть метка, имеющие определённые параметры? Это можно сделать использовав в ymaps.templateLayoutFactory.createClass функцию? Я заметил, что build: function() {} у меня вообще не вызывается.
Krem-Ilia,
Похоже, что вы делаете что-то подобное
dimik,
видимо да, но несравненно проще. У меня при плике на метку (или перещёлкиванию в балуне) выбирается объект - сохраняется в какую-то переменную.
Если это метка - я делаю предыдущую активную метку обычного цвета, а теперешнюю - другого, она становится активной. Дальше я хочу чтобы при отдалении значок кластера тоже был разным.
Попробую сейчас в моём objectManager.clusters.options.set({}) указать clusterIconContentLayout с переписанными функциями build и оттуда этот вопрос разрулить путём навешивания класса на див.
dimik,
ещё раз спасибо за комментарии и ответы здесь, я разобрался с этим делом.
Я сделал так, в установке опций кластера сделал пустой href, вот так:


objectManager.clusters.options.set{clusterIcons: [{href: '', size: [60, 60], offset[-30, -30]}]});


Далее я добавил


ymaps.layout.storage.add('postamat#clusterLayout', ymaps.templateLayoutFactory.createClass(`<div class="cluster">{{ properties.geoObjects.length }}</div>`, {
    build: function() {
        this.constructor.superclass.build.call(this);
        const geoObjects = this.getData().properties.geoObjects;
        // далее я смотрю, есть ли среди них такой, у кого gO.geometry.coordinates
        // совпадает с координатами выбранного
        // в таком случае я добавляю css-класс на
        // this.getParentElement().querySelector('div'), а там указана другая иконка.
    }
});


CSS такой:


.cluster {
  background-image: url(icon-cluster.svg);
  background-size 100% 100%;
  background-repeat no-repeat;
  line-height 60px;
  width 60px;
  height 60px;
  text-align center;
}


У меня только одна проблема осталась. Это то, что если карта не двигается, то выбрал ты сначала объект. Потом отдалил карту - появился активный кластер. А недалеко допустим ещё один объект. После того, как его кликнешь, активный объект сменится, но тот кластер останется активным. То есть ещё существует необходимость в определённых случаях специально проходить по всем кластерам и выполнять эту проверку на то, окрашивать его активным или нет.