AngularJs MemoryLeak Jquery - PullRequest
       2

AngularJs MemoryLeak Jquery

0 голосов
/ 21 января 2019

Я хочу отобразить пользовательский html на странице angularjs со следующей службой:

app.service('automaticFunctions', function ($timeout) {

this.init = function initAutomaticFunctions(scope, $elem, attrs) {
    switch (scope.content.type) {
        case 'list':
            ....
            break;  
        case 'scroll':
            ....
            break;
        case 'custom':

        function updateFrameContent() {
            var frame = $($elem).find(".customFrame")[0];

            if (scope.content.frameType === "url") {
                scope.content.ngHide.frameContent = true;
                scope.content.ngHide.frameUrl = false;
                frame.src = scope.content.frameUrl;
            }
            if (scope.content.frameType === "html") {
                scope.content.ngHide.frameUrl = true;
                scope.content.ngHide.frameContent = false;
                frame.onload = function () {
                    frame.contentWindow.document.write(scope.content.frameContent);
                    frame.onload = null;
                };
                frame.src = "";
                // frame = null;
            }
        }

            scope.$watchGroup(['content.frameType', 'content.frameContent', 'content.frameUrl'], function () {
                updateFrameContent();
            });
            updateFrameContent();
            break;
    }

}
});

Я вызываю процедуру init из директивы от 10 до 20 раз при маршрутизации между страницами.

У меня огромная утечка памяти, и я не знаю, как обработать переменную кадра.Если я установлю его на ноль, утечки памяти не будет, но содержимое не будет отображаться.

1 Ответ

0 голосов
/ 21 января 2019

У меня огромная утечка памяти, и я не знаю, как обработать переменную frame. Если я установлю его на null, утечки памяти не будет, но содержимое не будет отображаться.

Используйте событие $destroy, чтобы освободить объект frame:

    function updateFrameContent() {
        var frame = $($elem).find(".customFrame")[0];

        scope.$on("$destroy", function() {
            frame = null;
        });

        if (scope.content.frameType === "url") {
            scope.content.ngHide.frameContent = true;
            scope.content.ngHide.frameUrl = false;
            frame.src = scope.content.frameUrl;
        }

В среде AngularJS такие директивы, как ng-repeat, ng-if, ng-view и т. Д., Создают и уничтожают элементы DOM и дочерние области. Используйте событие $destroy, чтобы включить любой необходимый код разрыва.

Для получения информации см. Справочник по AngularJS $ scope API - События .

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