是否有必要在我的指令中包含一个destroy方法

时间:2014-09-19 13:02:32

标签: angularjs angularjs-directive

我编写了一个非常简单的指令,在单击该元素时添加/删除元素上的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

2 个答案:

答案 0 :(得分:1)

您无需手动删除该元素。你也不需要从范围解除任何东西,因为它将由angularjs itsef处理。

对于jquery dom监听器:

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

  

与.empty()类似,.remove()方法将元素取出   DOM。如果要删除元素本身,请使用.remove()   作为里面的一切。除了元素本身,所有   绑定事件和删除与元素关联的jQuery数据。

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

但我对此并不是100%肯定:)

答案 1 :(得分:1)

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

然而,关闭可以使任何物体保持活力,这样你需要担心的事情。您可以引入一个新函数,仍然在您试图销毁其范围的函数中引用变量对象,并阻止GC执行您可能想要的操作。同样,这不会影响你当前的例子,但它始终需要考虑。