Можно ли отключить стандартное поведение яндекс-карты при событии locationchange?

Мне необходимо разместить в центре координаты пользователя и отмасштабировать карту после определения его координат.

Сейчас карта масштабируется по какой-то своей логике.

Подписываюсь на событие locationchange так:

geolocationControl.events.add('locationchange', (event) => {
    let position = event.get('position');
    myMap.panTo(position)
    myMap.setZoom(3);
})

но реального масштабирования не происходит (точнее карта моргает на нужный зум и возвращается в свое какое-то предопределенное где-то состояние). Карта живет своей жизнью. Можно, конечно, подкостылить через setTimeout(() => {}, 1000), но это запасной план и он мне сильно не нравится

event.preventDefault();

тоже не работает


Ответы (2 шт):

Автор решения: HAGer

В принципе вопрос до сих пор актуальный. Но я нашел вполне приемлемое решение. Удалить стандартную кнопку и сделать свою, которая бы по клику делала только то, что мне нужно.

Разработчикам апи стоило бы подумать над возможностью передачи колбэка в эту кнопку. Потому что поведение карты уж слишком негибкое.

Сам скрипт под капотом работает довольно просто:

  1. вызывается
ymaps.geolocation.get({
  mapStateAutoApply: !0,
  useMapMargin: this.options.get("useMapMargin", !0)
})
  1. испускается событие "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) {
  // пишем свой обработчик
});
→ Ссылка