2012-10-25 12 views
10

Czy istnieje sposób, aby zapobiec wyzwalaniu zdarzenia zoom_change, jeśli wystąpi z powodu funkcji fitBounds()?Nie wywołuj zdarzenia "zoom_changed" podczas wywoływania funkcji fitBounds na mapie

Mam problem, w którym muszę wykonać wyszukiwanie na serwerze od klienta, gdy istnieje zmiana powiększenia na mapie, ale za każdym razem, gdy wywołuję funkcję fitBounds(), powoduje to wywołanie zoom_change, co powoduje, że klient wykonuje kolejne wyszukiwanie na serwerze. Interesuje mnie tylko zoom_change wykonywany przez użytkowników, a nie programowo za pomocą fitBounds.

Odpowiedz

8

Po wykonaniu funkcji fitBounds w programie należy ustawić flagę globalną. Po uruchomieniu zdarzenia zoom_changed, jeśli flaga jest ustawiona, wyczyść ją, w przeciwnym razie wyślij żądanie na serwer.

+1

To co mam aktualnie robi, ale kiedy istnieje jeden marker i dostaję granic dla jednego markera i zrobić map.fitBounds (granic) dwa razy wywołuje zdarzenie zoom_changed.Więc sposób, w jaki rozwiązuję to teraz, utrzymuje globalną tablicę i wciskam w nią obiekt za każdym razem, gdy wywołuję funkcję fitBounds, ale kiedy granice południowy zachód i północny wschód są takie same (co oznacza, że ​​masz wszystkie znaczniki w jednym miejscu lub tylko jeden znacznik na map), a następnie wciskam inny obiekt do tablicy, a gdy tablica jest pusta w wyzwalaczu, ponowne wyszukiwanie na serwerze –

-2

Przypuszczam, że powinno to być proste. Mają zmienną powiedzieć

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

i to po map.fitbounds() natychmiast zrobić

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

To stare pytanie, ale może to być przydatne dla innych. Miałem ten sam problem, zoom_changed został uruchomiony przy każdym wywołaniu fitBounds() podczas dodawania kilku znaczników do mapy. Co zrobiłem było dodać słuchacza do zdarzenia map_changed po Mapa została całkowicie załadowana, tak:

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

To nie jest dobre podejście. zoom_changed będzie strzelać wiele razy, aby powiększyć i pomniejszyć, ponieważ płytki ładują go ponownie. – Abram

+1

O mój boże. @Abram, twój komentarz był lifesaved. Wyciągałam włosy, próbując dowiedzieć się, dlaczego każde zdarzenie zbliżenia w moim kodzie powodowało wielokrotne zdarzenia zoom_changed, a twój komentarz dał mi to, czego potrzebowałem. Jezus Chrystus. Wydawałoby się, że zdarzenie zoom_changed może wystrzelić tylko po zmianie zoomu ... –

3

Po wielu frustrujących godzin, tu jest moje rozwiązanie:

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

Zauważ, że jestem wywoływanie addListenerOnce dla tilesloaded, aby upewnić się, że detektor zoome_changed zostanie dodany tylko raz, po zakończeniu pierwszego fitBounds.

0

W mojej aplikacji mogę uruchamiać zdarzenia zmiany powiększenia programowo, za pośrednictwem setZoom(), fitBounds() lub setOptions().

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

Następnie trasa wszystkie połączenia programowe ustawienie zoomu poprzez wrappery że odwraca flagę false zanim pójdą na ustawienie zoomu.

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); 
}; 

Następnie deklaruję słuchaczy. Na początku byłem deklarując tylko pierwszy, i był zaskoczony, że to nie działa:

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; 
    } 
); 

można również znaleźć wydarzenie idle pomocny, jednak, jeśli jesteś po prostu stara się uniknąć początkowego zestawu. Więcej informacji o wydarzeniach map można znaleźć tutaj: https://developers.google.com/maps/documentation/javascript/events

1

Istnieje inny sposób, aby to zrobić, usuwając to wydarzenie. Myślę, że byłoby to znacznie łatwiejsze i czystsze niż dodanie zmiennej globalnej.

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

Innym sposobem (zapomniał dodać, że):

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