2013-02-20 14 views
25

मुझे मेमोरी लीक के बिना गतिशील रूप से कोणीय अनुप्रयोगों को लोड/अनलोड करने में सक्षम होना चाहिए। JQuery में आप $("#elementHoldingMyWidget").remove(); कर सकते हैं और उचित विनाश कोड निष्पादित हो जाता है, ईवेंट हैंडलर अनबाउंड इत्यादि हैं।एंजुलरजेस ऐप को कैसे नष्ट करें?

मैं कोणीय दस्तावेज़ों में कुछ भी नहीं ढूंढ पा रहा हूं, जो बूटस्ट्रैप होने के बाद एक ऐप को फाड़ने की संभावना का उल्लेख करता है।

मेरे 1st प्रयास तो जैसे rootScope नष्ट करने के लिए किया गया था:

var rootScope = $("body").scope(); 
rootScope.$destroy(); 

लेकिन यह काम किया जाना प्रतीत नहीं होता है, और मुझे यकीन है कि कैसे इंजेक्टर और सेवाओं भी यह करता है, तो साफ हो जाएगा नहीं कर रहा हूँ किया।

यह कैसे किया जाना चाहिए?

+4

मुझे लगता है कि आपको जो प्रश्न पूछने की आवश्यकता है, उसे आपको स्मृति से ऐप को हटाने की आवश्यकता क्यों है? एक उदाहरण परिदृश्य जहां इसकी आवश्यकता है, इसे बहुत स्पष्ट करने में मदद मिलेगी। –

उत्तर

0

अद्यतन 10 मार्च, 2013: मुझे पता चला कि $ ('body') खाली(); ऐप को फाड़ नहीं आता है। यह अभी भी रहता है।

मूल पोस्ट:

खैर, इस पोस्ट: https://github.com/angular/angular.js/issues/1537#issuecomment-10164971 दावों है कि वहाँ कोई 'सरकारी' एप्लिकेशन फाड़ (लेखन के समय), लेकिन तुम सिर्फ तत्व तो जैसे एप्लिकेशन पकड़े खाली कर सकते हैं :

$('body').empty(); 

यदि यह नहीं है कि तुम क्या आप अपने अनुप्रयोग नीचे फाड़ करने के लिए एक अस्थायी समाधान के लिए इन चरणों के माध्यम से जा सकते हैं के लिए देख रहे हैं: https://github.com/angular/angular.js/issues/1537#issuecomment-10184033

+0

हाँ। मैं कहूंगा कि यह वास्तव में इसका समर्थन नहीं करता है। धन्यवाद। – CHS

+4

बीटीडब्ल्यू। मैंने पाया कि $ ('बॉडी') खाली(); ऐप को फाड़ नहीं आता है। यह अभी भी रहता है। – mlunoe

10

$('body').empty के माध्यम से, मैं पहले $delete() बच्चे स्कोप एक सफेद पेज के साथ उपयोगकर्ता पेश बिना अपने आवेदन फाड़ और फिर $rootScope से सभी गुण निकालने के लिए:।

/* 
* Iterate through the child scopes and kill 'em 
* all, because Angular 1.2 won't let us $destroy() 
* the $rootScope 
*/ 
var scope = $rootScope.$$childHead; 
while (scope) { 
    var nextScope = scope.$$nextSibling; 
    scope.$destroy(); 
    scope = nextScope; 
} 

/* 
* Iterate the properties of the $rootScope and delete 
* any that possibly were set by us but leave the 
* Angular-internal properties and functions intact so we 
* can re-use the application. 
*/ 
for(var prop in $rootScope){ 
    if (($rootScope[prop]) 
     && (prop.indexOf('$$') != 0) 
     && (typeof($rootScope[prop]) === 'object')) { 
      $rootScope[prop] = null; 
     } 
} 
16

का उपयोग AngularJS 1.4.0, $ rootScope $ नष्ट() फिर से काम कर रहा है (क्योंकि यह 1.2 में टूट गया था)। कई परुलरजेएस ऐप्स के बीच स्विच करने के लिए इस परमिट का उपयोग करना:

var appManager = new function() { 
    this.currentAppName; 
    this.currentApp; 

    this.startApp = function (appContainerId, appName) { 
     if (this.currentApp) { 
      this.destroyApp(this.currentApp, this.currentAppName); 
     } 
     var appContainer = document.getElementById(appContainerId); 
     if (appContainer) { 
      this.currentAppName = appName; 
      this.currentApp = angular.bootstrap(appContainer, [appName]); 
     } 
    } 

    this.destroyApp = function (app, appName) { 
     var $rootScope = app.get('$rootScope'); 
     $rootScope.$destroy(); 
    } 
} 

// Call this when page is ready to rebootsrap app 
appManager.startApp('divContainerId', 'app'); 
+0

इसे 'angular.element (' # someNode ') के साथ जोड़ना। खाली()' मेरे लिए चाल है। –

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