Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 有必要在我的指令中包含销毁方法吗_Angularjs_Angularjs Directive - Fatal编程技术网

Angularjs 有必要在我的指令中包含销毁方法吗

Angularjs 有必要在我的指令中包含销毁方法吗,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我编写了一个非常简单的指令,在单击元素时添加/删除元素上的css类 app.directive('dropdown', function() { var open = false, element, callback = function(){ open = !open; if (open) { element.addClass('open'); } else { element.r

我编写了一个非常简单的指令,在单击元素时添加/删除元素上的css类

app.directive('dropdown', function() {
    var open = false, element,

    callback = function(){
        open = !open;
        if (open) {
            element.addClass('open');
        } else {
            element.removeClass('open');
        }
    };

    return {
        scope: {},
        link: function(scope, elem){
            element = elem;
            elem.bind('click', callback);
            scope.$on('$destroy', function(){
                elem.unbind('click', callback);
                elem.remove();
            });
        }
    };
});
我认为$destroy方法可能没有必要。因为我使用了内置的jqlite,监听器将与元素一起销毁,对吗?调用elem.remove()还有什么好处吗。我在一些例子中看到过,但不确定是否有必要

有什么想法吗


C

您肯定不必手动移除该元素。您也不需要从范围中解除任何绑定,因为它将由angularjs itsef处理

对于jquery dom侦听器:

如果您正在引用JQuery,angular将使用它而不是其内部jqLite实现。这意味着本机jquery remove方法将用于元素删除。remove的jquery文档说明:

与.empty()类似,.remove()方法从 多姆。如果要删除元素本身,也可以使用.remove() 就像里面的一切。除了元素本身,所有 与元素关联的绑定事件和jQuery数据将被删除

所以我认为你不需要解开听众的束缚


但我不是100%确定:)

在您的情况下,您应该没事,因为事件绑定到被删除的元素,因此处理程序与元素本身一起被销毁。现在,如果您的指令将事件绑定到其自身DOM元素之外的父级,则需要在$destroy上手动删除该事件

然而,闭包可能会导致任何对象保持活动状态,所以这是您确实需要担心的事情。您可以引入一个新函数,该函数仍然引用您试图破坏其作用域的函数中的变量对象,从而阻止GC执行您可能希望它执行的操作。同样,这不会影响你当前的例子,但这是一个必须考虑的问题。