2012-10-25 11 views
10

क्या ज़ूम_change ईवेंट ट्रिगर होने से रोकने के लिए कोई तरीका है यदि यह फिटबाउंड() के कारण होता है?फिट पर कॉल करने पर 'zoom_changed' ईवेंट को आग न करें

मुझे कोई समस्या है जहां मुझे क्लाइंट से सर्वर पर एक खोज करने की ज़रूरत है, जब मैप में ज़ूम परिवर्तन होता है लेकिन हर बार जब मैं फिटबाउंड() को कॉल करता हूं तो यह ज़ूम_चेंज को ट्रिगर करने का कारण बनता है जिससे क्लाइंट दूसरी खोज करता है सर्वर पर मुझे केवल उपयोगकर्ताओं द्वारा किए गए zoom_change में दिलचस्पी है और फिटबाउंड का उपयोग करके प्रोग्रामेटिक रूप से नहीं।

उत्तर

8

जब आप अपने प्रोग्राम में फिटबाउंड करते हैं, तो वैश्विक ध्वज सेट करें। जब zoom_changed ईवेंट आग लगती है, अगर ध्वज सेट किया गया है, तो इसे साफ़ करें, अन्यथा सर्वर से अपना अनुरोध भेजें।

+1

यही कारण है मैं वर्तमान में क्या कर रहा हूँ, लेकिन जब वहाँ एक मार्कर है और मैं सिर्फ एक मार्कर के लिए सीमा हो और map.fitBounds (सीमा करना) यह ज़ूम_changed घटना दो बार ट्रिगर करता है।तो जिस तरह से मैं इसे हल करता हूं, अब मैं एक वैश्विक सरणी रखता हूं और हर बार जब मैं फिट कॉल करता हूं तो उस वस्तु में धक्का देता हूं लेकिन जब दक्षिण पश्चिम और उत्तर पूर्व समन्वय सीमाएं समान होती हैं (जिसका अर्थ है कि आपके पास एक ही स्थान पर सभी मार्कर हैं या केवल एक मार्कर हैं मानचित्र) तो मैं किसी अन्य ऑब्जेक्ट को सरणी में दबाता हूं और जब सरणी खाली होती है तो सर्वर –

-2

मुझे लगता है कि यह सरल होना चाहिए। एक चर कहना

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 
4

कर यह एक पुराने सवाल है है, लेकिन यह दूसरों के लिए उपयोगी हो सकता है। मुझे एक ही समस्या थी, zoom_changed प्रत्येक बार जब मैंने fitBounds() को मानचित्र पर कई मार्कर जोड़ते समय ट्रिगर किया था। क्या मैंने किया था map_changed घटना के लिए श्रोता जोड़ने के लिए के बाद नक्शा पूरी तरह से इस तरह, लोड किया गया था था:

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

पर एक रेडो खोज ट्रिगर में यह एक अच्छा तरीका नहीं है। ज़ूम_changed ज़ूम इन और आउट के लिए कई बार आग लग जाएगा क्योंकि टाइलें बार-बार ट्रिगर कर रही हैं। – Abram

+1

ओह मेरे भगवान। @ अब्राम, आपकी टिप्पणी एक lifesaved था। मैं अपने बालों को खींचने की कोशिश कर रहा था कि यह पता लगाने की कोशिश क्यों कर रहा था कि मेरे कोड में हर ज़ूम घटना क्यों ज़ूम_चेंज की घटनाओं को आग लग रही थी, और आपकी टिप्पणी ने मुझे जो चाहिए वह मुझे दिया। ईसा मसीह। आपको लगता है कि ज़ूम_changed ईवेंट केवल ज़ूम बदलता है जब ज़ूम बदलता है ... –

3

कई निराशा घंटे के बाद, यहाँ मेरी समाधान है:

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

ध्यान दें कि मैं कर रहा हूँ tilesloaded के लिए zoome_changed श्रोता को केवल fitBounds पूर्ण होने के बाद ही एक बार जोड़ा जाता है, यह सुनिश्चित करने के लिए addListenerOnce पर कॉल करना।

0

मेरे ऐप में, मैं 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

1

उस घटना को हटाकर ऐसा करने का एक और तरीका है। मुझे लगता है कि यह एक वैश्विक चर जोड़ने से ज्यादा आसान और क्लीनर होगा।

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){}); 
      } 
संबंधित मुद्दे