Как уничтожить приложение angularjs?
Мне нужно иметь возможность загружать/выгружать приложения angular динамически, не вызывая утечки памяти. В jQuery вы можете сделать $("#elementHoldingMyWidget").remove();
, и будет выполнен правильный код уничтожения, обработчики событий будут несвязаны и т.д.
Мне не удалось найти что-либо в документах angular, в которых упоминается возможность срывать приложение после его загрузки.
Моя первая попытка состояла в том, чтобы уничтожить rootScope следующим образом:
var rootScope = $("body").scope();
rootScope.$destroy();
Но это, похоже, не работает, и я не уверен, как инжектор и службы будут очищены, даже если бы это произошло.
Как это сделать?
Ответы
Ответ 1
ОБНОВЛЕНИЕ 10 марта 2013 года: Я обнаружил, что $('body'). empty(); не срывает приложение. Он все еще жив.
ОРИГИНАЛЬНАЯ ПОЧТА:
Что ж, этот пост: https://github.com/angular/angular.js/issues/1537#issuecomment-10164971 утверждает, что нет "официального" приложения срыва (на момент написания), но вы можете просто удалить элемент, удерживающий приложение, следующим образом:
$('body').empty();
Если это не то, что вы ищете, вы можете пройти эти шаги для временного решения для разрыва приложения:
https://github.com/angular/angular.js/issues/1537#issuecomment-10184033
Ответ 2
Использование AngularJS 1.4.0, $rootScope. $destroy() снова работает (поскольку оно было нарушено в 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');
Ответ 3
Чтобы снести мое приложение, не представляя пользователя с белой страницей через $('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;
}
}