Гео-объект, как скрыть / отобразить и эмулировать клик по гео-объекту зная его id?

354
02 декабря 2017, 11:21

На карте создаются геообъекты. У этих объектов есть уникальный для каждого id и при клике открывается попап с информацией о гообъекте (http://clip2net.com/s/3PWEiom). Пожалуйста, скажите, как можно скрыть, сделать видимым снова и эмулировать клик по этому геообъекту зная его id (например, id="place-1"). Вот код создания объектов на карте

(function ($) {
"use strict";
ymaps.ready(init);
var data = [];
var $mapBlock = $('.js-map');
function init() {
    var defaultCoords = [55.76, 37.64];
    var userCoords = defaultCoords;
    //Список городов
    var citys = {};
    $('.js-dealers-cities').each(function() {
        var city = $(this).data('city-name');
        var lat = $(this).data('city-lat');
        var lng = $(this).data('city-lng');
        citys[city] = {};
        citys[city]['lat'] = lat;
        citys[city]['lng'] = lng;
    });
    var geolocation = ymaps.geolocation,
        myMap = new ymaps.Map('map', {
            center: defaultCoords,
            zoom: 12,
            controls: []
        }),
        objectManager = new ymaps.ObjectManager({
            // Чтобы метки начали кластеризоваться, выставляем опцию.
            clusterize: false,
            geoObjectOpenBalloonOnClick: true,
            clusterOpenBalloonOnClick: false
        });
    myMap.controls.add('zoomControl', {
        position: {
            right: 10,
            bottom: 110
        }
    });
    geolocation.get({
        provider: 'yandex',
        mapStateAutoApply: false //true - автоматом центровать по положению пользователя
    }).then(function (result) {
        //Координаты пользователя
        userCoords = result.geoObjects.position;

myMap.setCenter(userCoords, 6, { flying: true, duration: 0 }); } });

    myMap.geoObjects.add(objectManager);
    $mapBlock.find('.map-point').each(function () {
        var $that = $(this);
        var coords = $(this).data('coords').split(',');
        if (!Layout.isDesktopLayout()) {
            data.push({
                "type": "Feature",
                "id": $that.data('id'),
                "geometry": {
                    "type": "Point",
                    "coordinates": coords
                }
            });
        } else {
            data.push({
                "type": "Feature",
                "id": $that.data('id'),
                "geometry": {
                    "type": "Point",
                    "coordinates": coords
                },
                "properties": {
                    "balloonContent": $that.html()
                }
            });
        }
    });
    objectManager.add(data);
    function onObjectEvent(id) {
        console.log(id);
        objectManager.objects.setObjectOptions(id, {
            balloonOffset: [-105, -35],
            hideIconOnBalloonOpen: false,
            balloonAutoPanMargin: 5,
            iconLayout: 'default#image',
            iconImageHref: '/themes/frontend/html/static/images/map-point.svg',
            iconImageSize: [25, 38],
            iconContentOffset: [-12, -19]
        });
    }
    function openPopup(e) {
        if (!Layout.isDesktopLayout()) {
            Popups.openById(e.get('objectId'));
        }
    }
    $mapBlock.find('.map-point').each(function () {
        objectManager.objects.events.fire('click', onObjectEvent($(this).data('id')));
    });
    objectManager.objects.events.add('click', openPopup);
}

})(jQuery);

Answer 1

Доброе утро.

К сожалению, ObjectManager не учитывает опцию "visible" у объекта. Так что единственный способ скрыть объект с карты в OM - это удалить его из менеджера.

Эмулировать событие в теории можно. Если взять координаты геообъекта через метод getById и вызвать objectManager.objects.events.fire('click', ... с этими данными. Но если задача состоит в том, чтобы вызывать открытие попапа программно, то архитектурно правильней будет это делать не через обработчик нативного события. Но тут уж надо задачу понять.

READ ALSO
Inputmask jquery начало маски с 8ки?

Inputmask jquery начало маски с 8ки?

Все приветПодскажите, пожалуйста, поставил этот скрипт "Inputmask" Ставлю такую маску { "mask": "8(###)###-##-##", "type": "mobile" } она выглядит так мне необходимо...

269
Gulp Browser-Sync CannotGet

Gulp Browser-Sync CannotGet

Всем привет, и легкого кодинга, помогите решить проблемус Gulp Browser-Sync

349
Вывод в таблицу ajax

Вывод в таблицу ajax

вывожу в один <td id="steam-id"></td>

260
Как получить все значения Объекта не перебирая ключи и не ссылаясь на них

Как получить все значения Объекта не перебирая ключи и не ссылаясь на них

Господа, у меня есть объект с разным уровнем вложенностиКак я могу получить то или иное значение я знаю, ниже есть наглядный пример:

248