Не запускайте событие "zoom_changed" при вызове функции fitBounds на карте

Есть ли способ предотвратить zoom_change события zoom_change, если оно происходит из-за fitBounds()?

У меня возникла проблема, когда мне нужно выполнить поиск на сервере от клиента, когда происходит изменение масштаба для карты, но каждый раз, когда я вызываю fitBounds() это вызывает zoom_change в результате чего клиент выполняет другой поиск на сервере. Меня интересует только zoom_change, выполняемый пользователями, а не программно использующий fitBounds.

Ответ 1

Когда вы делаете fitBounds в своей программе, установите глобальный флаг. Когда происходит событие zoom_changed, если флаг установлен, очистите его, в противном случае отправьте запрос на сервер.

Ответ 2

Это старый вопрос, но он может быть полезен другим. У меня была та же проблема, zoom_changed запускался каждый раз, когда я вызывал fitBounds() при добавлении нескольких маркеров на карту. То, что я сделал, это добавить слушателя в событие map_changed после полной загрузки карты, например:

google.maps.event.addListener(map, 'tilesloaded', function() {
    google.maps.event.addListener(map, 'zoom_changed', function() {

Ответ 3

После многих разочаровывающих часов, вот мое решение:

  var tiles_listener = google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
    var zoom_listener = google.maps.event.addListener(map, 'zoom_changed', function() {
      reloadMarkers();
    });
  });

Обратите внимание, что я вызываю addListenerOnce для tilesloaded, чтобы прослушиватель zoome_changed добавлялся только один раз, после завершения первого fitBounds.

Ответ 4

Есть другой способ сделать это, удалив это событие. Я думаю, это было бы намного проще и чище, чем добавление глобальной переменной.

 vm.map.events.bounds_changed = function() {
   google.map.event.removeListener(zoom_changed);
   }

Другой способ (забыли добавить это):

     vm.map.events.bounds_changed = function() {
google.map.event.addEventListener(zoom_changed,function(mapper,eventName,args){});
           }

Ответ 5

В моем приложении я могу программно сбрасывать события изменения масштаба с помощью setZoom(), fitBounds() или setOptions().

MAN = {};
MAN.globalMap = google.maps.Map(document.getElementById('map'));

Затем я маршрутизирую все программные вызовы, чтобы установить функции масштабирования с помощью функций обертки, которые переворачивают флаг до false, прежде чем они начнут устанавливать масштаб.

MAN.savedZoom = MAN.globalMap.getZoom();
MAN.saveZoomFlag = true;
// we want it to always be true, unless zoom was
// changed programatically.

MAN.setZoom = function setZoom(zoomLevel) {
  console.log("won't save that I'm setting zoomLevel to " + zoomLevel);
  this.saveZoomFlag = false;
  MAN.globalMap.setZoom(zoomLevel);
};

MAN.fitBounds = function fitBounds(bounds) {
  console.log("setting bounds, won't save zoomlevel.");
  this.saveZoomFlag = false;
  MAN.globalMap.fitBounds(bounds);
};

MAN.setOptions = function setOptions(options) {
  console.log("setting options, won't save zoomlevel.");
  this.saveZoomFlag = false;
  MAN.globalMap.setOptions(options);
};

Затем я объявляю слушателей. Сначала я объявлял только первый, и был озадачен тем, что он не работал:

  google.maps.event.addListener(
    MAN.globalMap,
    'zoom_changed',
    function zoom_changed_listener() {
      console.log(
        "zoom changed to " +
        MAN.globalMap.getZoom() + "; " +
        (MAN.saveZoomFlag ? "saving." : "not saving.")
      );
      if (MAN.saveZoomFlag) {
        console.trace("saving");
        MAN.savedZoom = MAN.globalMap.getZoom();
      }
      MAN.saveZoomFlag = true;
    }
  );

вы также можете найти событие idle полезным, однако, если вы просто пытаетесь избежать первоначального набора. Подробнее о событиях с картами можно узнать здесь: https://developers.google.com/maps/documentation/javascript/events

Ответ 6

Я полагаю, это должно быть просто. Имейте переменную say

var z = map.getZoom(); //scope this variable appropriately(somewhere before you call the fitbounds()

а затем после map.fitbounds() немедленно выполните

map.setZoom(z); //this automatically changes the zoom level back to the previous level