2011-06-28 5 views
8

मेरे पास स्थैतिक गुण हैं जो मैं अपने बैकबोन के उदाहरणों से एक्सेस करना चाहता हूं। मॉडल ऑब्जेक्ट्स। मुझे पता है कि मैं विधि को कॉल करने के लिए अभिभावक कन्स्ट्रक्टर को हार्डकोड कर सकता हूं, लेकिन यह मुझे पॉलिमॉर्फिक स्थिर कार्यों से रोकता है। उदाहरण के लिए, यदि आवश्यक हो, तो ExtendedInventory में foo फ़ंक्शन को ओवरराइड करने में सक्षम होना चाहिए, बिना किसी अन्य कोड को बदलने के।मॉडल नाम निर्दिष्ट किए बिना, मैं उस मॉडल के उदाहरण से स्थिर बैकबोन.मोडेल फ़ंक्शन कैसे कॉल कर सकता हूं?

var Inventory = Backbone.Model.extend({}, 
    //STATIC 
    { 
     foo: function() { 
      alert('bar'); 
     } 
    }); 

var i = new Inventory({}); 
i.constructor.foo(); //This works! 

var ExtendedInventory = Inventory.extend({}); 

var ei = new ExtendedInventory({}); 
ei.constructor.foo(); //THIS DOES NOT WORK 


//How do I generically access the `Inventory.foo()` function via the `ei` object. I would 
+0

तो, यह काम करता है लेकिन मैं इसे बहुत अच्छी तरह से समझ में नहीं आता और यह केवल फ़ायरफ़ॉक्स में काम करता है : ei.constructor.prototype .__ proto __। constructor.foo() –

+1

मैंने बैकबोन वाले स्थिर सदस्यों का उपयोग करने के उदाहरणों के साथ एक ब्लॉग पोस्ट लिखा है जो इस प्रश्न में आने वाले किसी के लिए उपयोगी हो सकता है। http://taurenmills.wordpress.com/2011/10/08/backbone-js-with-class-properties/ – Tauren

+0

+1 वर्ग गुणों पर ध्यान आकर्षित करने के लिए +1 – Chuck

उत्तर

2

आपके उदाहरण में वास्तव में क्या काम नहीं करता है? फ़ायरफ़ॉक्स और आईई दोनों में, मुझे 'बार' के साथ दो पॉपअप मिलते हैं, जो इच्छित परिणाम की तरह दिखते हैं? इसका स्थिर हिस्सा ठीक से व्यवहार करता प्रतीत होता है, this jsfiddle देखें।

(यह, btw रीढ़ की प्रमुख संस्करण के साथ है, पता नहीं है कि यदि एक फर्क नहीं पड़ता)

+0

धन्यवाद !! मैं दीवार के खिलाफ अपने सिर पर टक्कर लगी थी लेकिन एक नए संस्करण में अपग्रेड करने के कारण यह काम करता था जैसा मैंने आशा की थी। यह मुख्य बैकबोन साइट से 0.3.3 डाउनलोड के साथ काम नहीं करता है (त्रुटि है: ei.constructor.foo कोई फ़ंक्शन नहीं है)। मेरी इच्छा है कि मैं समझ गया कि वे अलग-अलग व्यवहार क्यों करते हैं इसलिए मैं एक अंतर करूंगा और देख सकता हूं कि मैं इसे समझ सकता हूं या नहीं। –

4

हम्म। हालांकि उपर्युक्त कोड काम करता है, मैं इसे इस तरह से नहीं छोड़ूंगा। यदि फ़ंक्शन कक्षा के किसी ऑब्जेक्ट के माध्यम से तार्किक रूप से सुलभ है, तो बेस क्लास में एक उदाहरण विधि को परिभाषित करें जो कक्षा/"स्थैतिक" फ़ंक्शन को कॉल करता है। इस कोड को स्वच्छ और साफ करता है, मुझे लगता है कि (प्लस, ग्राहकों को कुछ हद तक रहस्यमय वाक्य रचना को याद करने की जरूरत नहीं है):

var Inventory = Backbone.Model.extend({ 
    foo: function() { 
     this.constructor.foo(); 
    } 
}, { 
    foo: function() { 
     alert('bar'); 
    } 
}); 

var i = new Inventory({}); 
i.foo(); //This works! 

var ExtendedInventory = Inventory.extend({}); 

var ei = new ExtendedInventory({}); 
ei.foo(); 
+1

मुझे यह सुझाव पसंद है ... धन्यवाद! स्थिर कार्यों को पंजीकृत करने के लिए दूसरे पैरा का उपयोग करने के लिए –

+0

+1, यहां तक ​​कि आपने इसे कभी भी अपने उदाहरण में स्थिर नहीं किया: D Inventory.foo() ठीक काम कर रहा है, धन्यवाद;) – MaBi

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