2011-06-06 14 views
7

में this` संकल्प मैं एक मामला देखने विरासत का उपयोग करता है, और मेरे कोड अनिवार्य रूप से लग रहा है की तरह है:backbone.js विरासत देखें। `माता पिता

parentView = Backbone.View.extend({ 
    events: { 
     "some event": "business" 
    }, 
    initialize: function(){ 
     _.bindAll(this); 
    }, 
    business: function(e){ 
     ... 
     this.someFunc && this.someFunc(); 
     ... 
    } 
}); 

childView = parentView.extend({ 
    events: { 
     ... 
    }, 
    constructor: function(){ 
     this.events = _.extend({}, parentView.prototype.events, this.events); 
     parentView.prototype.initialize.apply(this); 
    }, 
    initialize: function(){ 
     _.bindAll(this); 
    }, 
    someFunc: function(){ 
     ... 
    } 
}); 

अद्यतन: ले जाया गया निर्माता को this.events विस्तार।

मेरे बच्चे के दृश्य में someFunc है, और मूल दृश्य में कुछ व्यावसायिक फ़ंक्शन के दौरान, यदि यह मौजूद है तो उसे उस फ़ंक्शन को कॉल करना चाहिए। यदि this ठीक से बच्चे दृश्य पर सेट है, तो this.someFunc मौजूद होना चाहिए। हालांकि, यह वह व्यवहार नहीं है जिसे मैं अनुभव कर रहा हूं।

initialize फ़ंक्शन (अभिभावक में) के दौरान, this वास्तव में बच्चे के दृश्य पर सेट है। हालांकि, जब some event आग, business फ़ंक्शन को thisparentView पर सेट किया गया है।

उत्तर

9

क्या आपने प्रारंभिक कार्य के बजाय, निर्माता में this.events विस्तार करने का प्रयास किया है? यदि आप प्रारंभ में ऐसा करते हैं, तो आप बहुत देर हो चुकी हैं; business फ़ंक्शन के लिए ईवेंट प्रतिनिधिमंडल पहले से ही कन्स्ट्रक्टर में सेटअप कर चुका है, और parentView पर इंगित करेगा (this.delegateEvents(); पर बैकबोन में देखें। व्यू के कन्स्ट्रक्टर)।

एक काम उदाहरण के साथ अपडेट किया गया:

ParentView = Backbone.View.extend({ 
    name: 'ParentView', 
    events: { 
     "event": "business" 
    }, 
    business: function(e){ 
     this.someFunc && this.someFunc(); 
    } 
}); 

ChildView = ParentView.extend({ 
    name: 'ChildView', 
    events: { 
    }, 
    constructor: function(){ 
     this.events = _.extend({}, ParentView.prototype.events, this.events); 
     console.debug(this.events); 
     ParentView.prototype.constructor.apply(this, arguments); 
    }, 
    someFunc: function(){ 
     console.debug('someFunc; this.name=%s', this.name); 
    } 
}); 

child = new ChildView(); 
$(child.el).trigger('event'); 
// logs 'this' in 'someFunc'; the name is 'ChildView'. 
+0

के बजाय __super__ का उपयोग करना पसंद है ठीक है, क्या आप मुझे parentView.prototype.initialize और parentView.constructor.in आरंभ करने के बीच अंतर बता सकते हैं? – idbentley

+0

मैंने अपना प्रश्न अपडेट किया है: एक ही समस्या मौजूद है, यहां तक ​​कि इस तकनीक का उपयोग भी। 'parentView.constructor.initialize' अपरिभाषित है। – idbentley

+0

मैंने यह भी कोशिश की है: 'parentView.prototype.constructor', बिना किस्मत के। – idbentley

0

आप बच्चे की इनिशियलाइज़ विधि को यह पंक्ति जोड़कर इस समस्या को हल कर सकते हैं:

_.bind(this.business, this) 

उम्मीद है कि किसी को अंतर्निहित तंत्र की एक बेहतर वर्णन करने के लिए आप इंगित कर सकते हैं की तुलना में मैं प्रदान कर सकते हैं, लेकिन मैं दे देंगे यह एक शॉट:

क्या होता है कि विधि उस दायरे के संदर्भ का उपयोग करेगी जिसे इसे अन्यथा बताया गया था। initialize को बच्चे के संदर्भ का उपयोग करने के लिए कहा जाता है जब आप parentView.prototype.initialize.apply(this) पर कॉल करते हैं क्योंकि आप लागू विधि के संदर्भ में this के साथ बच्चे दृश्य में गुजर रहे हैं।

आप उपरोक्त वर्णित underscore.js bind विधि का उपयोग करके बच्चे के संदर्भ में व्यवसाय विधि को बाध्य कर सकते हैं।

+0

ठीक है, लेकिन वह भी '_.bindAll' समारोह क्या करता है। बिना किसी अतिरिक्त पैरामीटर के इसका उपयोग करके, इसे ऑब्जेक्ट में सभी कार्यों से जोड़ना चाहिए। दुर्भाग्यवश, यह या तो काम नहीं करता है। – idbentley

+0

ओह ठीक है I gotcha, तुम सही हो। सुनिश्चित नहीं है :( – c3rin

2

असल में, मुझे नहीं पता कि यह आपके मामले को हल करता है, लेकिन मैं आमतौर पर ऐसा करता हूं: this.constructor.__super__.initialize.apply(this, arguments); और एक आकर्षण की तरह काम करता है। मेरा समाधान पूरी तरह से गलत है।

var Model1 = Backbone.Model.extend({ 
    method: function() { 
    // does somehting cool with `this` 
    } 
}); 

var Model2 = Model1.extend({ 
    method: function() { 
    this.constructor.__super__.method.call(this); 
    } 
}); 

var Model3 = Model2.extend({ 
    method: function() { 
    this.constructor.__super__.method.call(this); 
    } 
}); 

var tester = new Model3(); 

// Boom! Say hallo to my little stack-overflowing recursive __super__ call! 
tester.method(); 

Model2::method में this.constructor.__super__ करने के लिए कॉल करने के लिए (ड्रम-रोल) Model2::method हल होगा: यहां इसका कारण बताया।

हमेशाExplicitClassName.__super__.methodName.call(this, arg1, arg2 /*...*/) या कॉफी-स्क्रिप्ट का super का उपयोग करें।

+0

मुझे हार्डकोडिंग पैरेंट क्लास नाम –

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