Подтвердить что ты не робот

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

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

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

Моя первая попытка состояла в том, чтобы уничтожить rootScope следующим образом:

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

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

Как это сделать?

4b9b3361

Ответ 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;
        }
}