Клуб API Карт

Как при наведении на пункт списка менять стандартную метку, а если метка в кластере, то метку соответствующего кластера?

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

Пусть существует кэш-набор GeoObject, а каждый пункт HTML-списка обладает атрибутом data-id, который соответствует определённому ключу в этом наборе. При наведении и уходе курсора с пункта считывается data-id, берётся экземпляр из кэша и проверяется его состояние по отношению к кластеризатору. Если объект не кластеризован, производятся манипуляции над его меткой. Иначе над кластером, в котором он состоит.

 

Работает подсветка меток, однако подсветка кластеров упрямится.

  

 

// Базовая иконка для всех кластеров
clusterer.options.set('preset', 'twirl#darkgreenClusterIcons');

// Подсветка точки на карте при наведении на пункт списка
//
list.on({

    // Установить активную иконку метки/кластера
    mouseenter: function(){

        var id = $(this).attr('data-id');

        // Объект кэширован ранее
        if (cache[id])
        {
            // Получить состояние объекта из текущего кластеризатора
            var state = clusterer.getObjectState(cache[id]);

            // Работать с кластером, если объект кластеризован
            if (state.isClustered)
            {
                // Не оказывает никакого эффекта, кластер иконку не меняет.
                state.cluster.options.set('iconLayout', 'twirl#redClusterIcons');

                // Ещё одна безуспешная попытка.
                //state.cluster.options.set('preset', 'twirl#redClusterIcons');


                //console.log(state.cluster.options);
            }
            // Работать с объектом (успешно справляется)
            else
            {
                cache[id].options.set('preset', 'twirl#redDotIcon')
            }
        }
    },

    // Вернуть исходную иконку метки/кластера
    mouseleave: function(){

        var id = $(this).attr('data-id');

        if (cache[id])
        {
            var state = clusterer.getObjectState(cache[id]);

            // Работать с кластером, если объект кластеризован
            if (state.isClustered)
            {
                // Зависит от подобного решения для mouseenter
                // state.cluster.options.set('iconLayout', 'twirl#darkgreenClusterIcons');
            }
            // Работать с объектом (успешно справляется)
            else
            {
                cache[id].options.set('preset', 'twirl#darkgreenIcon')
            }
        }
    }

}, '.co-item');

 

 

Заранее спасибо

2 комментария

Дело в том, что пресеты заточены под то, чтобы их задавали кластеризатору. 

Из-за этого все опции внутри пресета имеют префикс cluster, так что если завать их напрямую в кластер, они не применяются.

Мы подумаем, как разрешить эту проблему.

А пока что могу посоветовать вот такое решение:

cluster.options.set('icons', ymaps.option.presetStorage.get('twirl#blueClusterIcons').clusterIcons);

 

Да, это именно то, что нужно :) Всё работает. Благодарю.