2012-07-20 7 views
9

मैं एक नक्शा बना रहा हूं जो & लोडिंग बॉक्स और ज़ूम स्तर दोनों के आधार पर मार्कर को नष्ट कर देता है। मुझे मार्करों को ठीक से हटाने के लिए एक वास्तविक समस्या हो रही है, ऐसा लगता है कि कभी-कभी कुछ स्थितियों के लिए काम करना प्रतीत होता है।Google मैप्स एपीआई v3: मार्करों को हटाया नहीं जा रहा है

मेरे पास एक ऑब्जेक्ट है जिसमें मार्कर जानकारी है, जिसमें Google मानचित्र मार्कर ऑब्जेक्ट भी शामिल है। मेरा कोड पता लगाता है कि क्या बाउंडिंग बॉक्स या ज़ूम-स्तर के आधार पर बाजार हटाया जाना चाहिए। मैंने मार्कर ऑब्जेक्ट को "setMap (null) पर सेट किया है;" और फायरबग का उपयोग करके मैं देख सकता हूं कि यह सेट हो रहा है, फिर मैं मूल ऑब्जेक्ट को पूरी तरह हटा देता हूं और ऑब्जेक्ट्स डेटा की लंबाई ठीक से अपडेट होती है।

जब मार्कर माना जाता है तो मैं फायरबग कंसोल पर आउटपुट करता हूं, ऐसा लगता है कि मैं काम कर रहा हूं और मैं देख सकता हूं कि मार्कर को बाउंडिंगबॉक्स परिवर्तन पर मार्करों के लिए अजाक्स कॉल से फिर से क्रेट नहीं किया जा रहा है।

फिर भी यदि मैं मानचित्र के चारों ओर ज़ूम करता हूं तो मैं कभी-कभी देख सकता हूं कि मार्कर हटा दिए जा रहे हैं, अगर मैं ज़ूम करता हूं तो माउस को नीचे दबाकर पैन करें। या कभी-कभी मार्कर हटा दिए जाएंगे यदि मैं पहली बार ज़ूमआउट करता हूं, लेकिन यदि मैं फिर से ज़ूम करता हूं तो वापस निकाल दिया जाता है, उन्हें हटाया नहीं जाता है।

मुझे अपने कोड के तर्क के साथ कुछ गलत करना होगा, मैं स्टंप हूं।

आप http://www.trailforks.com/map/test.php?lat=49.352247&lon=-123.202413 जे एस का स्रोत देख सकते हैं http://www.trailforks.com/map/includes/map.js

एक मार्कर को हटाने के लिए कोड नीचे

function clearMarkerMemory(mapItem, i) { 
    google.maps.event.removeListener(mapItem.lis); // remove stored listener 

    mapper.data[i].obj.setMap(null); // remove marker 
    mapper.data.splice(i, 1); 

    console.log("removed marker "+mapItem.icon+":"+mapItem.nid+' '+mapItem.name); 
}; 

पर है मैं कंसोल के लिए में कुछ और डिबग कहा, जा रहा है मानचित्र के एक साधारण क्षेत्र में केवल 2 मार्कर http://www.trailforks.com/map/test.php?lat=49.641783767&lon=-123.49878636730955&z=14

मैं मार्कर बनाए गए मार्कर देख सकता हूं, फिर मानचित्र को स्थानांतरित कर सकता हूं यह और देखें कि मार्कर फिर से बनाए गए नहीं थे क्योंकि वे मार्कर ऑब्जेक्ट में पाए गए थे। मैं फिर व्यूपोर्ट को स्थानांतरित करता हूं, इसलिए मार्करों में से एक स्क्रीन से बाहर है और मैं देख सकता हूं कि मार्कर हटा दिया गया है और मार्कर ऑब्जेक्ट की लंबाई अपडेट है। लेकिन अगर मैं मार्कर पर मानचित्र को वापस पैन करता हूं तो मानचित्र पर अभी भी है।

संपादित करें, (टिप्पणियों के बाद):

google.maps.event.addListener(map, 'dragend', function() { refreshMarkers(); }); //refresh markers when user moves map 
google.maps.event.addListener(map, 'zoom_changed', function() { refreshMarkers(); }); //refresh markers when user moves map 

करने के लिए परिवर्तन यह:

होने वाली ईवेंट हैंडलर के कई उदाहरण को रोकने के लिए

enter image description here

+1

मुझे वास्तव में बग अगर "बग" को पुन: उत्पन्न करने में कठिनाइयों का सामना करना पड़ रहा है। आपके कोड पर एक नज़र डालें और यह अच्छी तरह से लिखा है और AFAICS आप सही काम कर रहे हैं। ऐसा नहीं है कि इससे कोई फर्क नहीं पड़ता है, लेकिन क्या आपने सरणी से अलग करने से पहले पूरे 'डेटा [i] 'ऑब्जेक्ट को' null' पर सेट करने का प्रयास किया है? – dda

+0

+1 एक अच्छी तरह से लिखित, बुद्धिमान प्रश्न, बीटीडब्ल्यू के लिए +1 ... – dda

+0

इस दृष्टिकोण को प्राप्त करने के लिए http://www.trailforks.com/map/test.php?lat=49.344530719060245&lon=-123.1294569147949&z=13 फिर क्लिकडैग माउस तो बाईं ओर सभी पीले मार्कर स्क्रीन से बाहर हैं। फिर माउस को दबाकर उस दिशा में मानचित्र को खींचें, इसलिए मार्करों का AJAX कॉल अभी तक आग नहीं है, आप देखेंगे कि सभी मार्कर हटा दिए गए हैं। लेकिन फिर एक बार और बाहर ज़ूम करें और इसे फिर से प्रयास करें और यह संभवतः टूटा जाएगा, मार्कर अब 100% रहेंगे। भले ही वे mapper.data ऑब्जेक्ट से हटा दिए गए हों। – Canadaka

उत्तर

0
कर के बजाय

साथ ही, एक वैश्विक चर का उपयोग किया जा सकता है, निम्नानुसार:

google.maps.event.addListener(map, 'bounds_changed', function() { 
if (processing) { // var processing is global 
    return; 
} 
processing = true; 
refreshMarkers(); 
processing = false; 

}); //refresh markers when user moves map 

इसमें दोनों स्थितियों को शामिल करना चाहिए। जैसा कि अब है, दो अलग-अलग आयोजन श्रोताओं के साथ, AJAX कॉल विरोधाभासी हो सकती है, और आप पहले व्यक्ति को पूरा करने से पहले एक दूसरी कॉल फायर कर सकते हैं।

+0

"bounds_changed" का उपयोग करने में समस्या यह है कि यह माउस के हर छोटे आंदोलन के लिए AJAX कॉल के एक टन को कॉल करना शुरू कर देता है, जब उपयोगकर्ता माउस को "ड्रैगेंड" करने देता है तो यह सैकड़ों के बराबर हो सकता है। लेकिन मैंने वैसे भी कोशिश की है और समस्या अभी भी बनी हुई है, अगर मैं मार्करों के एक इंच को लोड करने के आसपास पैन करता हूं तो ज़ूम आउट करता हूं, एकल श्रोता के साथ भी मार्करों को हटाया नहीं जाता है। मैंने ड्रैगेंड या ज़ूम_changed को सक्षम करने के साथ भी परीक्षण किया है। – Canadaka

+0

यह आसानी से एक वैश्विक चर के साथ रोका गया है जो इंगित करता है कि एक घटना संसाधित की जा रही है। (मेरे जवाब में संपादन देखें)। – Marcelo

+0

उपर्युक्त कोड अभी भी काम नहीं करता है, यह कभी भी सच नहीं लगता है, और मुझे फायरबग कंसोल में निरस्त पोस्ट का एक स्वर मिलता है, नक्शा सुपर लगी है। सिर्फ एक श्रोता होना अच्छा लगेगा, लेकिन मुझे काफी यकीन है कि मार्करों को हटाने से मेरी समस्या कई श्रोताओं से संबंधित नहीं है क्योंकि मैं केवल 1 श्रोता सक्षम करने में समस्या उत्पन्न कर सकता हूं। – Canadaka

3

मैं लंबे समय तक इसी तरह की समस्या से जूझ रहा था जब तक मुझे एहसास हुआ कि नक्शा मार्कर की सेटमैप-विधि असीमित है। जब आप इसे कॉल करते हैं और तुरंत उस मार्कर ऑब्जेक्ट के किसी भी संदर्भ को हटाते हैं, तो ब्राउजर का कचरा कलेक्टर इसे स्मृति से ऊपर रखता है और साफ़ करता है और इस प्रकार वास्तविक निकालने के ऑपरेशन को होने से रोकता है।

स्प्लिस कॉल के साथ लाइन पर टिप्पणी करके इसे देखें और देखें कि क्या इससे मदद मिलती है। यदि यह मदद करता है, तो आपको ऑब्जेक्ट को हटाने में देरी या वैकल्पिक रूप से मार्कर ऑब्जेक्ट के संदर्भ को संग्रहीत करने पर विचार करना चाहिए जब तक कि यह वास्तव में हटाया न जाए। यह पता लगाने के लिए कि क्या यह वास्तव में हटा दिया गया है? मुझे पता नहीं है।

मुझे आशा है कि इससे मदद मिलती है!

संबंधित मुद्दे