我编写了一个非常简单的指令,在单击该元素时添加/删除元素上的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
答案 0 :(得分:1)
您无需手动删除该元素。你也不需要从范围解除任何东西,因为它将由angularjs itsef处理。
对于jquery dom监听器:
如果您正在引用JQuery,则angular将使用它而不是其内部jqLite实现。这意味着本机jquery remove方法将用于元素删除。删除的jquery文档说:
与.empty()类似,.remove()方法将元素取出 DOM。如果要删除元素本身,请使用.remove() 作为里面的一切。除了元素本身,所有 绑定事件和删除与元素关联的jQuery数据。
所以我认为你不需要解开你的听众。
但我对此并不是100%肯定:)
答案 1 :(得分:1)
在你的情况下,你应该没问题,因为事件被绑定到被删除的元素,因此处理程序与元素本身一起被销毁。现在,如果你的指令将事件绑定到它自己的DOM元素之外的父节点,那么需要在$ destroy上手动删除它。
然而,关闭可以使任何物体保持活力,这样你需要担心的事情。您可以引入一个新函数,仍然在您试图销毁其范围的函数中引用变量对象,并阻止GC执行您可能想要的操作。同样,这不会影响你当前的例子,但它始终需要考虑。