如何从父指令中删除注入的组件范围

时间:2019-03-29 16:55:07

标签: angularjs dom

我有一个指令,该指令可根据某些输入向DOM动态添加子自定义指令。一切正常。但是,当输入发生更改并且我使用一组不同的子自定义指令重新渲染DOM时,不会删除子自定义指令的旧范围,因此,附加到它们的事件处理程序仍在内存中。

我仅通过设置element [0] .innerHTML =”重新呈现DOM。 有没有一种方法可以删除/销毁自定义指令的作用域?我在一些文章中看到了scope。$ 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 个答案:

答案 0 :(得分:3)

问题在于,由于我的应用程序是多范围的,因此我没有销毁父级中的子范围。本文对我有帮助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 :(得分:1)

在自定义指令上处理destroy事件

directive("CustomDirective", function(){
    return {
        restrict: 'C',              
        template: '<div >Custom Directive</div>',                
        link: function(scope, element){                  
            scope.$on("$destroy",function() {
                element.remove();
            }); 
        }
    }
});