2013-02-20 23 views
25

Açısal uygulamaları dinamik olarak bellek sızıntılarına neden olmadan yükleme/boşaltma yapabilmem gerekir. JQuery'de $("#elementHoldingMyWidget").remove(); yapabilir ve uygun imha kodu gerçekleştirilir, olay işleyicileri bağlanmamıştır.Bir angularjs uygulaması nasıl yok edilir?

Açılış dokümanı açıldıktan sonra bir uygulamayı yırtma olasılığından bahsetmişken, açısal belgelerde hiçbir şey bulamadım.

Benim 1 girişimi şöyle rootScope yok etmekti:

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

Ama bu çalışıyor gibi görünmüyor ve ben enjektör ve hizmetler bile eğer düzeltileceği emin değilim yaptı.

Bu nasıl yapılmalı?

+4

Soruyu sormanız gereken soru, neden uygulamayı bellekten kaldırmanız gerektiğidir. Bunun gerekli olduğu bir örnek senaryo, bunu açıklığa kavuşturmaya yardımcı olacaktır. –

cevap

0

UPDATE 10 Mart 2013: $ ('body'). Boş(); uygulamayı yırmaz. Hala yaşıyor.

ORİJİNAL POST:

Eh, bu yazı: hayır 'resmi' uygulaması (yazma anda) yıkmak, ama sadece bu yüzden gibi app tutan eleman boşaltabilir olduğunu https://github.com/angular/angular.js/issues/1537#issuecomment-10164971 iddialar :

$('body').empty(); 

bu uygulamanızı yıkmak için geçici bir çözüm için bu adımların gidebilirsiniz için size aradığınızı değilse: https://github.com/angular/angular.js/issues/1537#issuecomment-10184033

+0

Evet. Hayır, hayır bunu desteklemiyor. Teşekkürler. – CHS

+4

Btw. Ben $ ('vücut'). Boş(); uygulamayı yırmaz. Hala yaşıyor. – mlunoe

10

$rootScope tüm özelliklerini kaldırmak sonra da çocuk kapsamları, ilk $delete()$('body').empty üzerinden bir beyaz sayfa ile kullanıcı sunmadan başvurumu yıkmak ve için:.

/* 
* 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

kullanma angularjs 1.4.0, $ rootScope $ yok() tekrar çalışıyor (1.2'de olduğu gibi). Birden çok angularJS uygulaması arasında geçiş yapmak için bu izinleri kullanma:

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

Bunu “angular.element ('# someNode') ile birleştirerek boş()' benim için hile yaptı. –

İlgili konular