Можно ли отключить стандартное поведение яндекс-карты при событии locationchange?
Мне необходимо разместить в центре координаты пользователя и отмасштабировать карту после определения его координат.
Сейчас карта масштабируется по какой-то своей логике.
Подписываюсь на событие locationchange так:
geolocationControl.events.add('locationchange', (event) => {
let position = event.get('position');
myMap.panTo(position)
myMap.setZoom(3);
})
но реального масштабирования не происходит (точнее карта моргает на нужный зум и возвращается в свое какое-то предопределенное где-то состояние). Карта живет своей жизнью. Можно, конечно, подкостылить через setTimeout(() => {}, 1000), но это запасной план и он мне сильно не нравится
event.preventDefault();
тоже не работает
Ответы (2 шт):
В принципе вопрос до сих пор актуальный. Но я нашел вполне приемлемое решение. Удалить стандартную кнопку и сделать свою, которая бы по клику делала только то, что мне нужно.
Разработчикам апи стоило бы подумать над возможностью передачи колбэка в эту кнопку. Потому что поведение карты уж слишком негибкое.
Сам скрипт под капотом работает довольно просто:
- вызывается
ymaps.geolocation.get({
mapStateAutoApply: !0,
useMapMargin: this.options.get("useMapMargin", !0)
})
- испускается событие "locationchange"
this.events.fire("locationchange", {
position: this._geoObjects.get(0).geometry.getCoordinates(),
geoObjects: this._geoObjects
})
Всё это можно сделать и руками.
И тогда совсем не понятно, почему бы не дать возможность рулить процессом обработки этих действий. И еще не ясно, под капотом передается mapStateAutoApply: true, почему бы хотя бы это не параметризировать тем более, что useMapMargin параметризируется?
Вот такой вариант можно сделать:
myMap.controls.remove('geolocationControl'); // удаляем если уже есть
var geolocationControl = new ymaps.control.GeolocationControl({
options: // передаем опции если какие-то надо
})
myMap.controls.add(geolocationControl);
geolocationControl.events.add('locationchange', function (e) {
// пишем свой обработчик
});