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




extjs garbage-collection (2)

यदि आप युक्त तत्व निकालते हैं तो 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 का उपयोग कर रहा हूँ।


मैंने थोड़ी देर के लिए यह खुद को सोचा। सेटर्स के बिना AngularJS नोटिस $scope ऑब्जेक्ट में कैसे बदलता है? क्या यह उन्हें मतदान करता है?

यह वास्तव में क्या करता है यह है: मॉडल को संशोधित करने वाला कोई भी "सामान्य" स्थान पहले से ही AngularJS के गले से बुलाया गया था, इसलिए यह आपके कोड चलाने के बाद स्वचालित रूप से आपके लिए $apply । मान लें कि आपके कंट्रोलर की एक विधि है जो कुछ तत्वों पर ng-click करने के लिए ng-click है। चूंकि एंगुलरजेएस आपके लिए उस विधि को एक साथ बुलाता है, $apply उसे उचित जगह पर $apply करने का मौका मिलता है। इसी प्रकार अभिव्यक्तियों के लिए जो विचारों में सही दिखाई देते हैं, उन्हें एंगुलरजेएस द्वारा निष्पादित किया जाता है, इसलिए यह $apply

जब एंगुलरजेएस के बाहर कोड के लिए मैन्युअल रूप से $apply कॉल करने के बारे में प्रलेखन बात करते हैं, तो यह कोड के बारे में बात कर रहा है, जो दौड़ते समय, कॉलर स्टैक में एंगुलरजेएस से स्वयं नहीं होता है।





javascript extjs garbage-collection