javascript - क्या एक्स्टजेएस स्वचालित रूप से कचरा घटकों को एकत्रित करता है



extjs garbage-collection (1)

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

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);

(साइड नोट: यह तथ्य कि पैनल इसके युक्त तत्व का संदर्भ रखता है, ब्राउज़र का कूड़ा कलेक्टर इसे नष्ट करने से रोकता है)

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

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

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

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

निम्न मामले की कल्पना करें, जहां मेरे पास निम्न HTML दस्तावेज़ हैं:

<html>
    <head>... include all the js and css here...</head>
    <body>
        <div class="placeholderForExtPanel"></div>
    </body>
</html>

अब कहीं मेरे कोड में, मैं अपने प्लेसहोल्डर में एक पैनल को प्रस्तुत करने के लिए ExtJS को बताता हूँ

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

थोड़ा बाद में, कोड का कुछ अन्य भाग DOM से प्लेसहोल्डर डिव को निकालने का निर्णय करता है।

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

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





garbage-collection