2013-11-22 7 views
5

कल्पना कीजिए निम्नलिखित मामले में, जहां मैं निम्नलिखित HTML दस्तावेज़ होता है।ExtJS स्वचालित रूप से कचरा इकट्ठा घटकों

var container = Ext.select('.placeholderForExtPanel'); 
Ext.create('Ext.form.Panel', { 
    title: 'My Panel' 
}); 

कुछ समय बाद, कोड के कुछ अन्य भाग डीओएम से प्लेसहोल्डर div को हटाने का निर्णय लेते हैं।

Ext.select('.placeholderForExtPanel').first().remove(); 

इस मामले में, पैनल के साथ क्या होता है जिसे पहले घोषित किया गया था? क्या मुझे इसे मैन्युअल रूप से नष्ट करने की ज़रूरत है, या क्या एक्स्टजेस जानता है कि इसमें तत्व शामिल है जिसे सिर्फ डीओएम से हटा दिया गया था और इसे पैनल को ही नष्ट कर देना चाहिए? मैं ExtJS 4.1 का उपयोग कर रहा हूँ।

उत्तर

4

यदि आप तत्व को हटाते हैं तो ExtJS स्वचालित रूप से घटकों को नष्ट नहीं करेगा। तत्व को डीओएम से हटा दिया जाएगा, लेकिन पैनल इसका संदर्भ रखता है। प्रयास करें निम्नलिखित:

Ext.select('.placeholderForExtPanel').first().remove(); 
console.log(Ext.getCmp('panel-id').getEl().dom.parentNode); // assuming your panel's id is "panel-id" 

तत्व अभी भी मौजूद है, और तुम सिर्फ फिर से डोम से संलग्न सकता है अगर आप:

document.body.appendChild(Ext.getCmp('panel-id').getEl().dom.parentNode); 

(साइड नोट: तथ्य यह है कि पैनल संदर्भ रखता है इसमें तत्व शामिल होने से ब्राउजर के कचरा कलेक्टर को इसे नष्ट करने से भी बचाता है)

असल में यह अन्य तरीकों से काम करता है, घटक इसके संबंधित डीओएम तत्वों का प्रबंधन करता है, इसलिए जब आप घटक को नष्ट करते हैं तो डीओएम तत्व भी हटा दिए जाएंगे।

इसके अलावा, किसी भी घटक है जो अन्य घटकों को शामिल कर सकते हैं (अर्थात Ext.container.Container और उसके उपवर्गों के सभी) अपने बच्चे घटकों में से किसी को नष्ट कर देगा, जब वे नष्ट कर रहे हैं (यह मानते हुए autoDestroy सक्षम किया गया है, जो कि डिफ़ॉल्ट है)।

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

var container = Ext.create('Ext.container.Container', { 
    cls: 'placeholderForExtPanel', 
    renderTo: Ext.getBody(), 
    items: [{ 
     xtype: 'panel', 
     title: 'mypanel' 
    }] 
}); 

container.destroy(); // destroys the container AND the panel 
+0

वास्तव में, reson मैं पूछ रहा हूँ ऐसा इसलिए है क्योंकि मैं एक ext.tree.Panel को ट्रीग्रिड के रूप में व्यवस्थित करना चाहता हूं जो कुछ पंक्तियों को उनके संबंधित ' 'के अंदर मनमानी घटकों को प्रस्तुत करने की अनुमति देता है। इसका मतलब है कि मैं घटकों को तत्काल बना रहा हूं और उन्हें '' अनजाने में प्रस्तुत कर रहा हूं, ट्री ग्रिड घटनाओं को तब नहीं भेजता जब यह निर्णय लेता है कि उन्हें '

'से' ' जोड़ने या निकालने की आवश्यकता है, जो मुझे रोकता है इस घटना को पकड़ना और घटक को नष्ट करना। तो मैं उम्मीद कर रहा था कि चीजें स्वचालित रूप से होती हैं। क्या आपको पता है कि मैं क्या कर सकता था? – LordOfThePigs

+0

मैंने रोबॉडी फीचर, या रोएक्सपेन्डर प्लगइन का उपयोग करने की कोशिश की, लेकिन उनमें से दोनों एक पेड़ ग्रिड के साथ निराशाजनक रूप से छोटी हैं। – LordOfThePigs

+0

आप इस पर [रीफ्रेश] (http://docs-origin.sencha.com/extjs/4.1.1/#!/api/Ext.tree.View-event-refresh) ईवेंट सुन सकते हैं, इस के रूप में जब भी ग्रिड व्यू HTML संरचना का पुनर्निर्माण करता है तब निकाल दिया जाएगा। इसके लायक होने के लिए, ग्रिड पंक्तियों या कोशिकाओं को घटकों को प्रतिपादित करना आम तौर पर बुरा विचार है (मैं वहां भी रहा हूं :)) क्योंकि दृश्य अक्सर ताज़ा कर सकता है (उदाहरण के लिए सॉर्टिंग पर) और संभावित रूप से कई घटकों को प्रस्तुत करने की आवश्यकता होती है, जो प्रदर्शन को धीमा कर दें। – matt

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