30

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

我一直无法在 Angular 文档中找到任何提到一旦启动应用程序就可能将其拆除的内容。

我的第一次尝试是像这样破坏 rootScope:

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

但这似乎不起作用,我不确定即使这样做了如何清理注入器和服务。

这应该怎么做?

4

3 回答 3

21

使用 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');
于 2015-06-04T14:11:48.193 回答
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;
        }
}
于 2014-02-27T10:44:12.383 回答
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

于 2013-02-27T20:06:50.500 回答