2009-08-17 11 views
8

मैं अपने जेएस कोड से dijit.layout.ContentPane, dijit.layout.StackContainer और dijit.layout.BorderContainer के उदाहरण बनाते हैं।मुझे प्रोग्रामेटिक रूप से तत्काल विगेट्स की स्टार्टअप() विधि कब कॉल करना है?

ऐसा लगता है कि मुझे प्रोग्रामेटिक रूप से बनाए गए उदाहरणों की startup() विधि को कॉल करना होगा। हालांकि, मुझे यकीन नहीं है कि मुझे इसे प्रत्येक विजेट के लिए कॉल करना होगा। उदाहरण के लिए, जब मैं 'new my.foo.widget()' करता हूं, तो startup() स्वचालित रूप से निकाल दिया जाता है।

startup() विधि को कॉल करने के दौरान मुझे समझने में सहायता के लिए धन्यवाद!

उत्तर

15

स्टार्टअप() _Widget में परिभाषित किया गया है, और यह केवल "जीवन चक्र का हिस्सा" है। यह विजेट जीवन चक्र में अंतिम चरण है, और सभी विजेट्स द्वारा इसकी आवश्यकता नहीं है। सबसे आम मामला जहां यह बिल्कुल जरूरी है जब प्रोग्रामेटिक रूप से लेआउट विजेट बनाते हैं। बच्चों को आकार देने की आवश्यकता होने पर अनावश्यक गणना को रोकने के लिए इसका उपयोग किया जाता है। उदाहरण के लिए, एक सीमा नियंत्रक। सच है या मैनुअल निष्पादन:

var bc = new dijit.layout.BorderContainer({ 
    style:"height:200px; width:200px" 
}); 

// can call bc.startup() now, and the BorderContainer will resize 
// all children each time a new child is added. Or, we can add all 
// our children now, then trigger startup() and do it all at once. 

var top = new dijit.layout.ContentPane({ 
    region:"top", style:"height:100px" 
}).placeAt(bc); 
var mid = new dijit.layout.ContentPane({ region:"center" }).placeAt(bc); 

// now BC will do the calculations, rather than in between each 
// the above addChild/placeAt calls. 
bc.startup(); 

स्टार्टअप स्वचालित रूप से parseOnLoad के मामले में पार्सर द्वारा कहा जाता है। पार्सर स्टार्टअप() को कॉल करने में देरी करता है जब तक कि सभी पाए गए बाल विगेट्स को उचित रूप से तत्काल नहीं किया जाता है।

dijit.Dialog एक अजीब मामला है। स्टार्टअप() को इस विजेट पर भी कॉल किया जाना चाहिए।

var dialog = new dijit.Dialog({ title:"Hmm", href:"foo.html" }); 
dialog.startup(); 
dialog.show(); 

अधिकांश विगेट्स स्टार्टअप की आवश्यकता होती है नहीं कहा जाता है, लेकिन ऐसे मामलों में जहां कुछ _Widget से इनहेरिट स्टार्टअप सदस्य पर हावी नहीं होता है, कॉल अनिवार्य रूप से एक नहीं सेशन सेटिंग this._started सच = है, यदि आप अपना स्टार्टअप() फ़ंक्शन बनाते हैं, तो आपको या तो इस.inherited (तर्क) को कॉल करना चाहिए या बस _started ट्रिगर को मैन्युअल रूप से सेट करना चाहिए।

दोजो 1.4 में, यहां जीवन चक्र को थोड़ा समायोजित किया गया है।पहले, widgetsInTemplate के साथ एक विजेट: सच माता-पिता पर स्टार्टअप() से पहले बाल विगेट्स पर स्टार्टअप() को कॉल करेगा। 1.4 में बच्चों के स्टार्टअप() को माता-पिता स्टार्टअप() के बाद बुलाया जाएगा। यह व्यवहार विगेट्स के साथ नेस्टेड विगेट्स के कई स्तरों के लिए रिकर्सिव है ITemplate: सत्य तत्काल हैं।

कॉलस्टार्ट() को कॉल करने के लिए हमेशा "सुरक्षित" होता है, हालांकि यदि आप "जानते हैं" (क्योंकि यह एक साधारण एंडपॉइंट विजेट है, या आपका स्वयं का कस्टम _विजेट कोड है) तो आप कॉल को छोड़ सकते हैं।

+1

बस जानकारी के लिए व्यवहार reg dijit.Dialog थोड़ा बदल गया है अब कॉलिंग शो स्वचालित रूप से समारोह के अंदर से स्टार्टअप कॉल – Gaurav

2

क्या आप वाकई इसे स्वचालित रूप से कहते हैं या आपके पास अपने विजेट में कोड है जो इसे कॉल करता है?

इसे कॉल करने का अच्छा अभ्यास है क्योंकि यह _started से true सेट करता है जिसका उपयोग व्यवहार और/या लेआउट को निर्धारित करने के लिए कुछ विजेट द्वारा किया जाता है। अधिकांश विजेट्स की आवश्यकता होती है कि आप इसे कॉल करें (जैसा कि आपने देखा है)।

startup मिश्रित विजेट्स द्वारा अत्यधिक उपयोग किया जाता है जिन्हें उप-विजेट को नियंत्रित करने की आवश्यकता होती है।

असल में, dijit._Widget से प्राप्त होने वाली किसी भी चीज़ को तत्कालता के बाद स्टार्टअप कॉल करना चाहिए।

संपादन:

वहाँ dijit जीवन चक्र जो लेख अपने आप में और टिप्पणियों में एक सा प्रारंभ करेंगे तो चर्चा करता है के बारे में एक article on SitePen है। यह दो साल से अधिक पुराना है और मुझे लगता है कि चीजें बदल गई हैं।

O'Reilly dojo book स्टार्टअप के बारे में भी बात करता है लेकिन यह कहता है कि इसे कंटेनर विजेट पर कॉल किया जाना चाहिए। मुझे इसे ग्रिड पर कॉल करना पड़ा है, हालांकि यह समझ में नहीं आता है।

यह वास्तव में इसे कॉल करके कुछ भी चोट नहीं पहुंचाता है (जब तक कि आप इसे अपने विजेट में जोड़े जाने से पहले इसे कॉल न करें)। मैं हमेशा यह कहूंगा।

+0

मैंने अभी कोशिश की है, और आप सही हैं। मेरे अपने विजेट के लिए भी, मुझे स्टार्टअप() खुद को कॉल करना होगा। Dijit.layout.ContentPane (http://docs.dojocampus.org/dijit/layout/ContentPane) के लिए डोजो कैम्पस के उदाहरण स्टार्टअप() विधि को कॉल नहीं करते हैं। इस विजेट के बारे में क्या? – Philippe

+0

हम्म, आप सही हैं। बिल्कुल यकीन नहीं है कि उस उदाहरण पर स्टार्टअप क्यों नहीं बुलाया जाता है। मैंने हमेशा इसे आदत से बाहर बुलाया है। – seth

0
startup (originating from dijit._Widget) 

बच्चे विगेट्स मार्कअप में घोषित के लिए, इस प्रक्रिया स्वतः ही एक बार विजेट आग और सभी बच्चे विगेट्स नहीं बनाई गई है। इस प्रकार, यह पहली सुरक्षित जगह है कि एक बच्चा विजेट सुरक्षित रूप से किसी बच्चे को संदर्भित कर सकता है। जितना सरल लगता है, इस कार्य को प्रायः पोस्टक्रेट में करने का प्रयास किया जाता है, जो असंगत व्यवहार का कारण बन सकता है जिसे पहचानना और मरम्मत करना मुश्किल हो सकता है। प्रोग्रामेटिक रूप से बनाए गए विगेट्स के लिए जिसमें किसी अन्य रिश्ते के हिस्से के रूप में अन्य बच्चे विजेट शामिल हैं, आपको यह सुनिश्चित करने के लिए मैन्युअल रूप से स्टार्टअप स्वयं को कॉल करने की आवश्यकता होगी जब सभी बच्चे विजेट बनाए गए हों। बच्चों के साथ प्रोग्रामेटिक रूप से बनाए गए विगेट्स के लिए आपको स्वयं को कॉल करने की आवश्यकता यह है कि जब तक कि सभी बाल विगेट्स जोड़े नहीं जाते हैं, तब तक आकार और प्रतिपादन के साथ आगे बढ़ने का अर्थ नहीं होगा। (अन्यथा, बहुत अच्छी तरह से झूठी शुरूआत हो सकती है।) यह विधि अंतिम विधि है कि आप डिजिटल निर्माण के दौरान होने वाले कस्टम व्यवहार के लिए ओवरराइड कर सकते हैं।

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