2014-12-15 9 views
8

आज एक बहुत ही "डाउन-द-खरगोश-छेद" में पार हो गया कोणीय प्रश्न आज मुझे जवाब नहीं मिला। $scope दस्तावेज़ों से, आप एक ईवेंट हैंडलर को "$destroy" पर पंजीकृत कर सकते हैं, जिसे किसी दायरे के विनाश से ठीक पहले कहा जाता है। इस तरह, आप तो जैसे ईवेंट हैंडलर्स अपंजीकृत कर सकते हैं:

var deregister = $scope.$on('myCustomEvent', function() { 
    // do some crazy stuff 
}); 
$scope.$on('$destroy', function() { 
    deregister(); 
}); 

हालांकि, $scope.$on('$destroy', ...) अपनी ही हैंडलर बनाना होगा। क्या यह स्वचालित रूप से नष्ट हो गया है, या क्या आपको इसे नष्ट करने के लिए निम्न की तरह कुछ करना है?

var deregister = $scope.$on('myCustomEvent', function() { 
    // do some crazy stuff 
}); 
var deregisterDestroy = $scope.$on('$destroy', function() { 
    deregister(); 
    deregisterDestroy(); 
}); 
+0

हां, यह नष्ट हो गया है - बेशक अगर यह कुछ भी हैंडलर को बाहरी रूप से संदर्भित करता है (और इस प्रकार यह सब कुछ बंद हो जाता है) तो उसे हटाया नहीं जाएगा (बस हर जगह की तरह)। –

+0

मुझे लगता है कि फॉलो-अप प्रश्न तब होंगे (ए) क्या इसे अपनाना आवश्यक है, और (बी) यदि हां, तो क्या आप इसे ऊपर लिखने के तरीके में भी अपमानित कर सकते हैं? – jdotjdot

+0

ना, आपके पास अनंत पुनरावृत्ति है - आपको इसे रद्द करने की आवश्यकता नहीं है, गुंजाइश नष्ट हो जाती है। मुझे यकीन है कि बहुत जल्द समय वाला कोई व्यक्ति सभ्य और विस्तृत उत्तर देगा :) –

उत्तर

1

उत्तर वास्तव में "शायद" है जिसका अर्थ यह है कि इसका अर्थ स्वचालित रूप से नष्ट हो रहा है। यदि हम स्कॉप्स के लिए $destroy विधि के स्रोत को देखते हैं, तो हम देख सकते हैं कि $destroy ईवेंट पूरे बच्चे के स्कॉप्स में नीचे प्रसारित किया जाता है, वास्तविक $destroy विधि किसी भी दायरे पर प्रारंभ नहीं की जाती है लेकिन प्रारंभिक एक। इसका मतलब है कि वास्तविक सफाई और गुणों से बाहर निकलना कभी भी बच्चे के दायरे पर नहीं होता है।

क्योंकि एक बार $destroy एक गुंजाइश पर लागू किया गया है, यह माता पिता के दायरे से अलग और के बाद से यह अब के लिए किसी भी पथ होना चाहिए इसलिए कचरा संग्रहण के लिए पात्र है हो जाता है कारण यह है कि इस स्मृति लीक नहीं करता है जीसी रूट्स यह वही तर्क सभी बाल क्षेत्रों पर लागू होता है क्योंकि उनके पास जीसी रूट्स के लिए कोई रास्ता नहीं होना चाहिए।

आपका उदाहरण सुरक्षित है हालांकि; जब मैं जरूरी हो तो अपने स्वयं के हैंडलर को साफ करने के लिए खुद को वैसे ही करता हूं और किसी भी प्रकार की अनंत लूप में नहीं चलता हूं।

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