2014-10-05 11 views
12

नामक $ नष्ट नहीं हो रहा है, अभिलेखागार में थोड़ी देर के लिए खोज रहे हैं और 'उत्तर के लिए नेट पर, लेकिन वास्तव में एक नहीं, बस बिट्स और टुकड़े ढूंढ रहे हैं। ऐसा लगता है कि बहुत सी सुझाई गई पोस्ट हैं, लेकिन उनमें से कोई भी जवाब नहीं है।एंगुलरजेएस: डायरेक्टिव स्कोप को

मेरे पास एक जटिल निर्देश है जो दायरे का उपयोग कर रहा है: सत्य। यह वास्तव में एनजी-ग्रिड नवीनतम 2.x संस्करण है जिसे मैं क्लीनअप कोड लिखने की कोशिश कर रहा हूं, क्योंकि यह सिर्फ पागल की तरह स्मृति को लीक कर रहा है, और हमारा ऐप अभी इसके साथ "अटक गया" है। यहां the plunk that demos the problem है। जब आप ग्रिड के माध्यम से क्लिक करते हैं और बाद में हीप स्नैपशॉट्स की जांच करते हैं, तो आप कई "unattached" ngGrid ऑब्जेक्ट्स देखेंगे। ये केवल श्रोताओं द्वारा निर्देश के दायरे पर आयोजित किए जाते हैं।

जब मैं कई ग्रिड (राज्यों) के माध्यम से क्लिक करके राज्यों (ui.route नवीनतम का उपयोग कर) बदल रहा हूं, तो ग्रिड निर्देश का दायरा $ नष्ट हो रहा है। हैंडलर काम कर रहा है। हालांकि, इस दायरे को खुद को $ नष्ट नहीं किया जा रहा है()। मैं ढेर स्नैपशॉट में देखता हूं कि निर्देश का दायरा अभी भी $$ श्रोताओं के माध्यम से तत्वों पर है। इसके अलावा, गुंजाइश। $$ नष्ट नहीं है।

हालांकि, दायरा। प्रोटोटाइपआईएस नष्ट हो गया। और क्योंकि यह है, मैं भी $ गुंजाइश,) कॉल कर सकते हैं नहीं $ निर्देश के $ ऑन $ नष्ट हैंडलर से नष्ट के बाद से आद्य के $ नष्ट (कॉल बदल $ की परिभाषा NOOP को नष्ट:।

ngGridDirectives.directive('ngGrid', ['$compile', '$filter', '$templateCache', '$sortService', '$domUtilityService', '$utilityService', '$timeout', '$parse', '$http', '$q', 
    function($compile, $filter, $templateCache, sortService, domUtilityService, $utils, $timeout, $parse, $http, $q) { 
    var ngGridDirective = { 
    scope: true, 
    compile: function() { 
     return { 
     pre: function($scope, iElement, iAttrs) { 
      $(iElement).on('$destroy', function cleanupElementNgGrid() { 
       $timeout(function() { 
       $scope.$destroy(); 
       $scope.destroyedByForce = true; 
       console.log("I destroyed it."); 
       },4000); 
      }); 
     ... 

स्कोप सेट करना। $$ श्रोताओं = {} 2000 के $ टाइमआउट के साथ (मेरे $-$ नष्ट श्रोता में सफाई समाप्त करने के निर्देश के लिए समय देने के लिए काम करना प्रतीत होता है, लेकिन आंतरिक के साथ मुठभेड़ करना गलत लगता है, और कभी-कभी यह । काफी देर तक नहीं ब्राउज़र सफाई समाप्त करने के लिए के लिए यह सिर्फ एक/kludge काम के आसपास है

मैं भी इस की कोशिश की:।

तो क्या मेरी निर्देश की गुंजाइश च रोक रहा है रोम $ $() स्वचालित रूप से इसे बुला रहा है?

पहले, मैंने सोचा था कि ऐसा इसलिए था क्योंकि हम दायरे का उपयोग करते हैं: निर्देश विकल्पों में सच है, क्योंकि प्रोटो स्कोप नष्ट हो गया है। तो मैंने a plunk to try that theory out लिखा था। लेकिन इस प्लंक के साथ, निर्देश का दायरा ठीक से नष्ट हो गया है और कोई वस्तु लीक नहीं हुई है। वास्तव में, बहुत आश्चर्यजनक। लेकिन मैं पहले प्लंक में एक ही दृश्य घोंसले का उपयोग नहीं करता हूं; हालांकि मुझे संदेह है कि यह है। विचार बदलते समय नियंत्रक का दायरा अभी भी मिटा दिया जाता है। मेरे पास अभी भी एक आंतरिक वस्तु पर एक दर्शक है। तो मुझे लगता है कि मैं एक समान गतिशील देखता हूं। लेकिन ऐसा लगता है कि $ विनाश वास्तव में उस आंतरिक दायरे पर बुलाया जाता है।

किसी भी विचार के बारे में कोई विचार जो निर्देशक क्षेत्र को $ नष्ट करने से रोकता है() इसे बुलाया जाता है? यह दायरे से संबंधित प्रतीत होता है: सच बिट, लेकिन मैं कहने के लिए पर्याप्त कोणीय आंतरिक पर्याप्त नहीं कर सकता।

अग्रिम धन्यवाद,

जेसी


अद्यतन: ठीक है, मैं इस मुद्दे के लिए एक अद्यतन पोस्ट करेंगे।

मेरी योग्यता के अनुसार, ऐसा लगता है कि क्या हो रहा है यह है कि तत्व के लिए मुख्य दायरा (ग्रिड निर्देश के लिए अर्ध-पृथक गुंजाइश नहीं) $ नष्ट हो जाता है। हालांकि, प्रोटोटाइप के रूप में उस दायरे का उपयोग करने वाले बच्चे का दायरा संभवतः $ नष्ट करने की विधि से बाहर निकलने की संभावना है, क्योंकि स्वयं $$ नष्ट हो गया है (प्रोटोटाइप विरासत)। तो श्रोताओं और निरीक्षक को मंजूरी नहीं मिलती है।

मैं शायद दायरे में पूरी तरह से अलग होने के निर्देश को अद्यतन कर सकता हूं, लेकिन मेरे पास इसके प्रभावों को हल करने का समय नहीं है।

मैंने यह भी पाया कि यह केवल $ नष्ट से अधिक है। $ स्कोप में निर्देशों के आधार पर परिभाषित बहुत सारे फ़ंक्शन हैं जो आंतरिक वर्र्स के आस-पास बंद होते हैं जिनमें बहुत सारी मेमोरी होती है।

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

आशा इस कोई आगे जाने में मदद करता है,

जम्मू

+1

ऊपर वर्णित संकल्प को दिखाते हुए अन्य प्लंक का लिंक यहां दिया गया है। http://plnkr.co/edit/r2uTKTJW2yJTbHx0kXYB – jessewolfe

+0

हाय, मुझे एक समस्या थी जो मुझे लगता है कि संबंधित है, क्या आपको कारण पता चला कि दायरे पर $ नष्ट नहीं किया जा रहा है? http://stackoverflow.com/questions/27467210/angular-directive-memory-leaks – Barnash

+0

शायद दिलचस्प: यह आलेख उप-क्षेत्रों के अर्थों (jquery का उपयोग कर) के खराब पड़ावों के कारण $ विनाश श्रृंखला में हो सकता है जो टूटने के बारे में बोलता है http: //www.bennadel.com/blog/2706-always-trigger-the-destroy-event-before-removing-elements-in-angularjs-directives.htm – Offirmo

उत्तर

1

पता नहीं है। मैंने हाल ही में एक बड़ी परियोजना पर काम किया जो एनजी-ग्रिड + एंजुलरज का इस्तेमाल करता था और हमारे पास आपके सामने आने वाले सभी मुद्दे थे: मेमोरी लीक गैलरी। हमने पाया कि वास्तव में सबकुछ अच्छी तरह से साफ नहीं किया जा रहा था और सभी जगहों पर स्कॉप्स और घड़ियों को लीक कर दिया गया था।

हमने एक बेहतर सफाई करने के लिए कुछ कस्टम तर्क जोड़ने की कोशिश की लेकिन यह हमारी समस्या को 100% हल नहीं किया। हमारे मुद्दों को क्षैतिज स्क्रॉलिंग + एनजी-ग्रिड पर वर्चुअलाइजेशन द्वारा भी बढ़ाया गया था, इसलिए यह ध्यान में रखना भी उपयोगी हो सकता है (अगर मुझे सही याद है कि वे भविष्य के संस्करण में इसे ठीक करने की योजना बना रहे हैं)।

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