我需要能够动态加载/卸载角度应用程序,而不会导致内存泄漏。在jQuery中,您可以执行$("#elementHoldingMyWidget").remove();
并执行正确的销毁代码,事件处理程序是未绑定的等等。
我一直无法在角度文档中找到任何内容,提到在应用程序被引导后可能会拆除应用程序。
我的第一次尝试是像这样销毁rootScope:
var rootScope = $("body").scope();
rootScope.$destroy();
但这似乎不起作用,我不确定注射器和服务如何清理,即使它确实如此。
应该怎么做?
答案 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