Как удалить область компонента, внедренного из родительской директивы - PullRequest
1 голос
/ 29 марта 2019

У меня есть директива, которая динамически добавляет дочерние пользовательские директивы в DOM на основе некоторого ввода.Все отлично работаетНо когда входные данные меняются, и я перерисовываю DOM с другим набором дочерних пользовательских директив, старые области действия дочерних пользовательских директив не удаляются, и, следовательно, прикрепленные к ним обработчики событий все еще находятся в памяти.

Я перерисовываю DOM, просто установив element [0] .innerHTML = ''.Есть ли способ удалить / уничтожить области действия пользовательской директивы?В некоторых статьях я видел, что можно вызывать область действия. $ Destroy, но как получить ссылку на область действия дочерней пользовательской директивы?

const linker = function (scope, element) {
scope.$watch('data', function () {
    reRenderToolbar();
}, true);

const reRenderToolbar = function () {
    element[0].innerHTML = '';
    _.forEach(scope.data, function (item, key) {
        const directive = item.CustomDirective;
        scope.options = item.options || {};
        html = '<' + directive + ' options="options"></' + directive + '>';
        element.append(html);
    }


   });
}

    $compile(element.contents())(scope);
    };

Ответы [ 2 ]

3 голосов
/ 01 апреля 2019

Проблема заключалась в том, что я не разрушал дочернюю область в родительском элементе, так как мое приложение имеет несколько областей.Эта статья помогла мне http://www.mattzeunert.com/2014/11/03/manually-removing-angular-directives.html Код:

    const linker = function (scope, element) {
scope.$watch('data', function () {
    reRenderToolbar();
}, true);
let childScope;

const reRenderToolbar = function () {
if(childScope) {
childScope.$destroy();
}
    element[0].innerHTML = '';
    _.forEach(scope.data, function (item, key) {
        const directive = item.CustomDirective;
        scope.options = item.options || {};
        html = '<' + directive + ' options="options"></' + directive + '>';
        element.append(html);
    }

   });
}


    childScope = scope.$new()
    $compile(element.contents())(childScope);
    };
1 голос
/ 30 марта 2019

в вашей пользовательской директиве обрабатывает событие уничтожения

directive("CustomDirective", function(){
    return {
        restrict: 'C',              
        template: '<div >Custom Directive</div>',                
        link: function(scope, element){                  
            scope.$on("$destroy",function() {
                element.remove();
            }); 
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...