2011-05-12 14 views
11

मेरी वर्तमान परियोजना में मैं ExtJs3.3 का उपयोग कर रहा हूं।
मैंने कई कक्षाएं बनाई हैं जिनमें निजी चर और कार्य थे। उदाहरण के लिए:निजी फ़ंक्शन और वेरिएबल्स ExtJs4?

MyPanel = function(config){ 
    config = config || {}; 

    var bar = 'bar';//private variable 

    function getBar(){//public function 
    return bar; 
    } 

    function foo(){ 
    //private function 
    } 

Ext.apply(config, { 
    title: 'Panel', 
    layout: 'border', 
    id: 'myPanel', 
    closable: 'true', 
    items: [] 
}); 

    MyPanel.superclass.constructor.call(this, config); 
}; 
Ext.extend(MyPanel , Ext.Panel, { 
    bar: getBar 
}); 
Ext.reg('MyPanel', MyPanel); 

मैं समझता हूँ कि ExtJs4 में काम करने के नए रास्ते Ext.define विधि का उपयोग करने के लिए है। तो जैसा कि कोड के अपने ऊपर टुकड़ा कुछ इस तरह दिखेगा:

Ext.define('MyPanel', { 
    extend: 'Ext.panel.Panel', 

    title: 'Panel', 
    layout: 'border', 
    closable: true, 

    constructor: function(config) { 

    this.callParent(arguments); 
    }, 

}); 

तो क्या मैं जानना चाहता हूँ मैं निजी चर और ExtJs4 में कार्यों तरह से मैं ExtJs3 में यह किया के समान कैसे परिभाषित कर सकते हैं?
दूसरे शब्दों में मैं समझता हूं कि Ext.define विधि मेरी नई कक्षा को परिभाषित करने, विस्तार करने और पंजीकरण करने का ख्याल रखेगी, लेकिन मुझे जावास्क्रिप्ट var कहां घोषित करना चाहिए जो वर्ग के गुण नहीं हैं बल्कि कक्षा द्वारा इसकी आवश्यकता है।

MyPanel = function(config){ 
    //In my Ext3.3 examples I was able to declare any javascript functions and vars here. 
    //In what way should I accomplish this in ExtJs4. 

    var store = new Ext.data.Store(); 

    function foo(){ 
    } 
    MyPanel.superclass.constructor.call(this, config); 
}; 

उत्तर

8

मैं इस तरह के निजी चर लागू करने का बड़ा प्रशंसक नहीं हूं लेकिन निश्चित रूप से यह किया जा सकता है। बस अपने निर्माता में चर करने के लिए सेटअप एक एक्सेसर समारोह (बंद)/initComponent समारोह:

constructor: function(config) { 
    var bar = 4; 
    this.callParent(arguments); 

    this.getBar = function() { 
     return bar; 
    } 
},... 
+0

आप इस @Rob पर विस्तार कर सकते हैं? मुझे [सेन्का मंच] पर बहुत अधिक समर्थन नहीं मिल रहा है (http://www.sencha.com/forum/showthread.php?245130- अंतर्दृष्टि-Ext-JS-4)। मैं अपने कार्यान्वयन के समान कुछ ढूंढने की उम्मीद कर रहा हूं (2012-05-31 पर किए गए प्रश्न अपडेट देखें) -> http://stackoverflow.com/questions/9104387/extjs-javascript- मॉड्यूल- डिज़ाइन-pattern-best-practices – blong

+0

हाय, मैं नीचे दी गई टिप्पणी से सहमत हूं कि कॉन्फ़िगर ऑब्जेक्ट का उपयोग ExtJS 4 या सेन्चा टच 2 का उपयोग करते समय आप चाहते हैं। कॉन्फ़िगरेशन आंतरिक चर और स्वचालित रूप से गेटर और सेटटर बनाता है। मैं उन्हें "आंतरिक चर" कह रहा हूं क्योंकि वे बिल्कुल "निजी" नहीं हैं। ऑब्जेक्ट में चारों ओर खुदाई करते समय आप उन्हें बदल सकेंगे लेकिन आपको एक प्रयास करना होगा :) जब आप कोई जटिल एप्लीकेशन बना रहे हैं तो मैं दृढ़ता से रखरखाव के लिए मैन्युअल परिभाषाओं के बजाय सेन्चा एमवीसी संरचना का उपयोग करने की सिफारिश करता हूं। शुभकामनाएँ –

+0

इस तरह कुछ के बारे में क्या: http://stackoverflow.com/a/6023603/320399। मैं उदाहरणों के लिए अद्वितीय उदाहरणों और निजी सदस्य चर के बीच साझा निजी कार्यों को देने के लिए 'Ext.define' को अनुकूलित करने की कोशिश कर रहा हूं। – blong

6

यही वास्तव में क्या config के लिए है, ExtJS डॉक्स से इस जाँच:

config: ऑब्जेक्ट कॉन्फ़िगरेशन विकल्प की सूची उनके डिफ़ॉल्ट मानों के साथ, जिसके लिए स्वचालित रूप से एक्सेसर विधियां उत्पन्न होती हैं। उदाहरण के लिए:

Ext.define('SmartPhone', { 
    config: { 
     hasTouchScreen: false, 
     operatingSystem: 'Other', 
     price: 500 
    }, 
    constructor: function(cfg) { 
     this.initConfig(cfg); 
    } 
}); 

var iPhone = new SmartPhone({ 
    hasTouchScreen: true, 
    operatingSystem: 'iOS' 
}); 

iPhone.getPrice(); // 500; 
iPhone.getOperatingSystem(); // 'iOS' 
iPhone.getHasTouchScreen(); // true; 
iPhone.hasTouchScreen(); // true 

इस तरह आप अपना वास्तविक क्षेत्र छुपाएं और अभी भी इसका उपयोग करें।

+1

यह 'लागू' और 'सेटर' विधि भी बनाएगा। आपको अभी भी लागू विधि को ओवरराइड करने की आवश्यकता होगी और यह सुनिश्चित करने के लिए शून्य वापस लौटना होगा कि पीपीएल मूल्य को बदल नहीं सकता है। आपके कोड में –

5

आप इस तरह के निजी सदस्य बना सकते हैं। लेकिन अगर आप इस वर्ग के लिए एक से अधिक उदाहरण बना रहे हैं तो यह उपयोगी नहीं होगा।

Ext.define('MyPanel', function(){ 

    var bar = 'bar';//private variable 

    function foo(){ 
     //private function 
    }; 
    return { 
     extend: 'Ext.panel.Panel', 
     title: 'Panel', 
     layout: 'border', 
     closable: true, 

     constructor: function(config) { 

      this.callParent(arguments); 
     }, 

     getBar: function(){//public function 
      return bar; 
     } 

    }; 

}); 

, धन्यवाद

नंदू

+0

'बार' और 'foo', वास्तव में स्थिर चर और फ़ंक्शन क्रमशः हैं। – Arvin

+0

मुझे संदेह है कि आप फ़ंक्शन बॉडी के बाद '()' गायब हैं? – Alex