Ответ 1
Когда вы делаете fitBounds в своей программе, установите глобальный флаг. Когда происходит событие zoom_changed, если флаг установлен, очистите его, в противном случае отправьте запрос на сервер.
Есть ли способ предотвратить zoom_change
события zoom_change
, если оно происходит из-за fitBounds()
?
У меня возникла проблема, когда мне нужно выполнить поиск на сервере от клиента, когда происходит изменение масштаба для карты, но каждый раз, когда я вызываю fitBounds()
это вызывает zoom_change
в результате чего клиент выполняет другой поиск на сервере. Меня интересует только zoom_change, выполняемый пользователями, а не программно использующий fitBounds
.
Когда вы делаете fitBounds в своей программе, установите глобальный флаг. Когда происходит событие zoom_changed, если флаг установлен, очистите его, в противном случае отправьте запрос на сервер.
Это старый вопрос, но он может быть полезен другим. У меня была та же проблема, zoom_changed
запускался каждый раз, когда я вызывал fitBounds
() при добавлении нескольких маркеров на карту. То, что я сделал, это добавить слушателя в событие map_changed
после полной загрузки карты, например:
google.maps.event.addListener(map, 'tilesloaded', function() {
google.maps.event.addListener(map, 'zoom_changed', function() {
После многих разочаровывающих часов, вот мое решение:
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
.
Есть другой способ сделать это, удалив это событие. Я думаю, это было бы намного проще и чище, чем добавление глобальной переменной.
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){});
}
В моем приложении я могу программно сбрасывать события изменения масштаба с помощью 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
Я полагаю, это должно быть просто. Имейте переменную 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