如何销毁angularjs应用程序?

时间:2013-02-20 21:41:46

标签: angularjs

我需要能够动态加载/卸载角度应用程序,而不会导致内存泄漏。在jQuery中,您可以执行$("#elementHoldingMyWidget").remove();并执行正确的销毁代码,事件处理程序是未绑定的等等。

我一直无法在角度文档中找到任何内容,提到在应用程序被引导后可能会拆除应用程序。

我的第一次尝试是像这样销毁rootScope:

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

但这似乎不起作用,我不确定注射器和服务如何清理,即使它确实如此。

应该怎么做?

3 个答案:

答案 0 :(得分:16)

使用AngularJS 1.4.0,$ rootScope。$ destroy()再次工作(因为它在1.2中被破坏)。使用此功能可以在几个angularJS应用程序之间切换:

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');

答案 1 :(得分: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;
        }
}

答案 2 :(得分:0)

更新2013年3月10日:我发现$('body')。empty();不会拆除应用程序。它仍然存在。

原始帖子:

好吧,这篇文章:https://github.com/angular/angular.js/issues/1537#issuecomment-10164971声称没有“官方”应用程序拆除(在撰写本文时),但你可以像这样清空持有应用程序的元素:

$('body').empty();

如果这不是您要找的内容,您可以通过以下步骤获取临时解决方案以撕下您的应用: https://github.com/angular/angular.js/issues/1537#issuecomment-10184033