2013-04-09 5 views
11

मेरे पास Extjs वेब एप्लिकेशन विकसित करने के कुछ महीनों का अनुभव है। मैं इस समस्या में भाग गया:Extjs कक्षाओं को ओवरराइड करना और कॉल का आह्वान करना माता-पिता

जब मैंने कक्षा को ओवरराइड किया, तो मैंने विधि संशोधित की और पिछले कार्यान्वयन का पालन किया और callParent() का आह्वान किया। ओवरराइडिंग हिस्सा काम करता है लेकिन callParent() ने पुराने कार्यान्वयन का आह्वान किया।

मेरी अधिभावी कोड

Ext.override(Ext.layout.component.Draw, { 
    finishedLayout: function (ownerContext) { 

     console.log("new layouter being overriden"); 
     this.callParent(arguments); 
    } 
}); 

ExtJS वर्ग विधि ओवरराइड करने के लिए:

finishedLayout: function (ownerContext) { 
    var props = ownerContext.props, 
     paddingInfo = ownerContext.getPaddingInfo(); 

    console.log("old layouter being overriden"); 
    this.owner.setSurfaceSize(props.contentWidth - paddingInfo.width, props.contentHeight - paddingInfo.height); 

    this.callParent(arguments); 
} 

कंसोल में, मैं संदेश पुराने layouter के बाद बाहर है कि पहले नई layouter प्रिंट देख सकते हैं कार्यान्वयन ... मैंने ब्रेकपॉइंट लगाया और पुराने लेआउट नामक नए लेआउट के callParent() को आविष्कार स्टैक को पीछे हटाना शुरू कर दिया। मुझे अभिभावक वर्ग को कॉल करने की आवश्यकता है, लेकिन ओवरराइड विधि नहीं है।

कोई समस्या यह समस्या हल करने के लिए कैसे करें?

+0

संस्करण को छोड़ने के लिए खेद है मैंने उपयोग किया, मैं ExtJs 4.1.2 का उपयोग कर रहा हूँ। चुना गया उत्तर सही दृष्टिकोण है लेकिन मैं इसका उपयोग नहीं कर सका, इसके बजाय मैंने @ वेंटोक द्वारा प्रदान किए गए उत्तर का उपयोग किया। –

+0

वैसे, अपने सुपरर्स में से एक को छोड़कर एक बड़ा हैक है, इसे समझदारी से और कम से कम इस्तेमाल करें! –

उत्तर

18

आप ExtJS 4.1.3 का उपयोग कर रहे या बाद में आप this.callSuper(arguments) का उपयोग ओवरराइड विधि "छोड़" करने के लिए कर सकते हैं और सुपर क्लास कार्यान्वयन को कॉल करते हैं।

विधि के लिए ExtJS documentation इस उदाहरण प्रदान करता है:

Ext.define('Ext.some.Class', { 
    method: function() { 
     console.log('Good'); 
    } 
}); 

Ext.define('Ext.some.DerivedClass', { 
    method: function() { 
     console.log('Bad'); 

     // ... logic but with a bug ... 

     this.callParent(); 
    } 
}); 

Ext.define('App.paches.DerivedClass', { 
    override: 'Ext.some.DerivedClass', 

    method: function() { 
     console.log('Fixed'); 

     // ... logic but with bug fixed ... 

     this.callSuper(); 
    } 
}); 

और टिप्पणियां:

पैच विधि callParent उपयोग नहीं कर सकते सुपर क्लास विधि कॉल करने के बाद कि ओवरराइड विधि युक्त कहेंगे बग। दूसरे शब्दों में, उपर्युक्त पैच केवल "फिक्स्ड" कंसोल लॉग में "अच्छा" उत्पन्न करेगा, जबकि कॉलपैंट का उपयोग करके "फिक्स्ड" तब "खराब" "अच्छा"

3

आप callParent का उपयोग नहीं कर सकते हैं, लेकिन आप सीधे दादा वर्ग विधि को सीधे कॉल कर सकते हैं।

GrandparentClass.prototype.finishedLayout.apply(this, arguments); 

यहां एक और सामान्य (यदि कुछ हद तक नाजुक) दृष्टिकोण है।

this.superclass.superclass[arguments.callee.$name].apply(this, arguments); 
+0

मुझे लगता है कि यह स्पष्ट है क्योंकि यह आपके इरादे को दिखाता है। विशेष रूप से ओवरराइड विधि छोड़ने के बाद एक हैक की तरह लगता है –

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