6

टी एल गूगल मैप्स कस्टम ओवरले, डॉमिश्रण के साथ बैकबोन दृश्य

PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype) है "उचित" एक बैकबोन दृश्य के लिए जिस तरह से एक और "वर्ग" से विरासत?

लांग

पढ़ हम रीढ़ का उपयोग कर हमारी साइट redoing रहे हैं और कुछ मानचित्रण कार्यक्षमता सहित पर काम कर रहे हैं।

मुझे एक बैकबोन दृश्य मिला है जो ब्राउज़र विंडो के भीतर विशिष्ट बिंदुओं पर <div> एस रखता है; यह Google की मानचित्र API को भौगोलिक निर्देशांक पर रखने के क्रम में विस्तार करने के लिए एक प्राकृतिक चीज़ की तरह लगता है।

कस्टम ओवरले उत्पन्न करने के लिए Google API के अनुसार, आप एक नई वस्तु बनाते हैं और उस ऑब्जेक्ट के लिए प्रोटोटाइप google.maps.OverlayView के नए उदाहरण पर सेट करते हैं। तुम तो उस वस्तु के शीर्ष पर तीन कार्यों को लागू ताकि वस्तु के प्रति जवाबी कार्रवाई:

onAdd

draw

onRemove

कहाँ onAdd एचटीएमएल पैदा करने और फिर शीर्ष पर इसे लागू करने के लिए जिम्मेदार है मानचित्र का इसके बाद यह draw पर कॉल करता है जो आपके द्वारा प्रदान किए गए लैट्लिंग जोड़े और सीमाओं के अनुसार सही ढंग से तत्व को स्थान देता है। जब आप अपनी परत से छुटकारा पाना चाहते हैं तो onRemove कॉल किया जाता है।

इसलिए मैंने इन तीन विधियों को शामिल करने के लिए अपने दृश्य को संशोधित किया है (जो केवल रेंडर और असेंडर कॉल करें और मेरे संग्रह से बंधे हैं)। और फिर बनाने के लिए "जादू होता है" मैं कर रहा हूँ:

PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype)

यह सही लगता है? मैं व्यू और मॉडल के लिए कोड पोस्ट कर सकता हूं जिस पर यह आधारित है, लेकिन ईमानदारी से, वे इस उदाहरण के लिए अप्रासंगिक हैं - कोड काम करता है और मैं कस्टम div एस बैकबोन मॉडल, व्यू और कंट्रोलर घटकों के माध्यम से जेनरेट करने में सक्षम हूं बिना किसी मुद्दे के मानचित्र पर, मैं जो पूछ रहा हूं, मुझे लगता है (और शायद यह प्रश्न प्रोग्रामर के लिए अधिक apropos है। इसलिए, मुझे बताएं और मैं इसे स्थानांतरित करूंगा)।

यह मेरे पिनव्यू को बैकबोन व्यू और Google मानचित्र ओवरले व्यू दोनों बनाने का सबसे आसान तरीका प्रतीत होता है, लेकिन मैं प्रोटोटाइप विरासत के साथ 100% सहज नहीं हूं यह जानने के लिए कि क्या मैं कुछ "गलत" कर रहा हूं या कुछ तोड़ रहा हूं कहीं सड़क के नीचे।

+0

हम्म अपने "जनक" कक्षा में initialize दृश्य ..., यह एक PinView गूगल मैप्स के साथ BackboneView के रूप में बनाने के लिए वास्तव में क्लीनर हो सकता है उस ओवरले से जुड़े पिनव्यू पर एक संपत्ति के रूप में ओवरले व्यू। Google कक्षाओं के आंतरिक के बारे में निश्चित नहीं है क्योंकि वे सभी minifications के साथ थोड़ा अस्पष्ट हैं - लेकिन मुझे लगता है कि मैं इन दोनों को मिश्रण करने से बचाना चाहूंगा क्योंकि वे विभिन्न प्रकार के वर्ग हैं और कौन जानता है कि क्या हो सकता है (हालांकि अगर यह काम करता है तो कृपया हमें बताएं!)। कुछ और मैं पूरी तरह से थोड़ा और खेलना पसंद करना चाहता हूं - अगर मेरे पास केवल समय था! –

+0

यह काम कर रहा है, मुझे लगता है कि मेरा प्रश्न और अधिक था "क्या आप वास्तव में ऐसा कर रहे हैं" से "प्रोटोटाइपियल विरासत का उपयोग करके आप एकाधिक विरासत कैसे करते हैं?" बैकबोन सामान सुपर क्लीन और स्वागत है, इसलिए मैं किसी प्रकार के प्रोटोटाइप नेमस्पेस टकराव के बारे में चिंतित नहीं हूं, और जब Google स्रोत को छोटा कर दिया जाता है, जब आप डीबगर में इसके साथ खेल रहे हैं, ओवरलेव्यू के लिए प्रोटोटाइप() वस्तु वास्तव में भी सुपर सरल है। – tkone

उत्तर

2

अच्छा विचार! मैं आमतौर पर मौसम के बारे में थोड़ा सा संदेह करता हूं या नहीं, जब आप काम करते हैं तो आप 'सही' नहीं होते हैं, यदि आप शोस्टॉपर में नहीं भागते हैं और ओवरले दिखाते हैं और जो करते हैं वह करता है तो मैं कहूंगा कि आप हैं ।

एक बात, करीब की जाँच करने के लिए, हालांकि:

यह नहीं है (और नहीं कर सकते हैं) हो "असली" एकाधिक वंशानुक्रम - कि अवधारणा एक प्रोटोटाइप आधारित भाषा में वास्तव में प्रासंगिक नहीं है: में से एक कार्यान्वयन एक विधि अपरिहार्य कम से कम जब _.extend()

का उपयोग कर इसका मतलब यह है कि अगर कोई सदस्य या तरीकों अपने _.extend() कॉल में Backbone.View में एक ही नाम और google.maps.OverlayView एक पिछले साथ कर रहे हैं हो जाएगा "जीत" होगा और ऊपर लिख अन्य कार्यान्वयन, वह जो लेता है। लेकिन जब मैं क्रोम के डेवलपर टूल्स का उपयोग करके उनका निरीक्षण करता हूं तो मुझे इस तरह की कोई स्पष्ट टक्कर नहीं दिखाई दे रही थी।

तो मेरी सिफारिश: इसका उपयोग जारी रखें, बस बहुत परीक्षण करें। मुझे कुछ समय इस तकनीक का एक उदाहरण देखना अच्छा लगेगा।

1

आह! तो मैं उपरोक्त कर रहा हूं, लेकिन यह कभी सही महसूस नहीं हुआ है।

तब मैं this discussion on a Backbone group जो मेरा पीछा करने के लिए सुराग मिला:

var MyView = (function(){ 
    var view = function(){ 
     Backbone.View.apply(this, arguments); 
    }; 

    view.extend = Backbone.View.extend; 

    _.extend(view.prototype, Backbone.View.prototype, google.maps.OverlayView.prototype, [other prototypes...], { [VIEW DEFINITION] }); 

    return view; 
}()); 

इस तरह अगर हम एक वर्ग हम extend से ing रहे हैं में परिभाषाओं में से किसी ओवरराइड करने के लिए की जरूरत है, हम कर सकते हैं, क्योंकि यह में पहले है _.extend श्रृंखला (बाद की परिभाषाएं पहले परिभाषाओं को ओवरराइट करती हैं)।

मैं "माता-पिता" ऑब्जेक्ट के संदर्भों का ट्रैक रखने के लिए 'विस्तारित' extend पर काम कर रहा हूं जो ओवरराइड किया जाएगा और उन्हें अभी भी कॉल करने के लिए एक विधि प्रदान करेगा (जैसे पायथन की super कॉल)। मैंने यह तय नहीं किया है कि यह बंदर-पैचिंग के माध्यम से किया जाना चाहिए, एक इंटरसेप्टर पैटर्न (अंडरस्कोर की _.tap() विधि या कुछ और के माध्यम से, लेकिन मुझे लगता है कि इसमें बहुत लचीलापन शामिल होगा।

इससे आपको एक परिभाषित करने की अनुमति मिल जाएगी जो "बच्चा" वर्ग के initialize दिनचर्या के अंत में _.super('ParentClass', 'initialize'); की तरह कुछ कर रही द्वारा कहा जा सकता है

+0

tkone: आपके अपडेट किए गए उत्तर के लिए धन्यवाद, क्या आप अपना कामकाजी कोड पोस्ट कर सकते हैं, मैं बैकबोन व्यू के साथ ओवरलेव्यू का उपयोग करने की कोशिश भी कर रहा हूं और इसमें असफल रहा .. मुझे इस तरह से पसंद आया, लेकिन किसी कारण से मुझे यह प्रतीत नहीं होता काम करने के लिए। – user1271518

+0

अंडरस्कोर के बाद के संस्करणों में (उदाहरण 1.1.2), '_.extend' अपेक्षा के अनुसार काम नहीं करता है। आपको एक कस्टम विस्तार विधि का उपयोग करना होगा (मैंने इसे अंडरस्कोर 1.0.0 से कॉपी किया है) –

+0

@Koen। क्योंकि सेमेवर की तरह? क्यों परेशान! – tkone

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