Как уничтожить приложение angularjs?

Мне нужно иметь возможность загружать / выгружать угловые приложения динамически, не вызывая утечек памяти. В jQuery вы можете сделать$("#elementHoldingMyWidget").remove(); и выполняется правильный код уничтожения, обработчики событий не связаны и т. д.

мы не смогли найти ничего в угловых документах, в которых упоминается возможность сносить приложение после его 'был загружен.

Моей первой попыткой было уничтожить rootScope примерно так:

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

Но это некажется, работает, и яЯ не уверен, как инжектор и службы будут очищены, даже если это произойдет.

Как это должно быть сделано?

 Liviu T.22 февр. 2013 г., 22:43
Я думаю, что вопрос, который вы должны задать, это почему вам нужно удалить приложение из памяти? Пример сценария, где это необходимо, поможет многое прояснить.

Ответы на вопрос(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;
        }
}

$ 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');
 Castro Roy19 дек. 2016 г., 08:12
Сочетая это сangular.element('#someNode').empty() сделал трюк для меня.
Решение Вопроса

ОБНОВЛЕНИЕ 10 марта 2013 г .: Я обнаружил, что $ ('тело») .Empty (); не сносит приложение. Это все еще живет.

ОРИГИНАЛЬНАЯ ПОЧТА:

Ну, этот пост:https://github.com/angular/angular.js/issues/1537#issuecomment-10164971 утверждает, что нет 'официальный» приложение разрушается (на момент написания), но вы можете просто очистить элемент, содержащий приложение, следующим образом:

$('body').empty();

Если это не то, что вы ищете, вы можете выполнить следующие шаги, чтобы найти временное решение для разрушения вашего приложения:https://github.com/angular/angular.js/issues/1537#issuecomment-10184033

 CHS28 февр. 2013 г., 00:10
Да уж. Я бы сказал, нет, это действительно нене могу это поддержать. Благодарю.
 mlunoe10 мар. 2013 г., 22:59
Btw. Я обнаружил, что $ ('тело») .Empty (); не сносит приложение. Это все еще живет.

Ваш ответ на вопрос