最佳实践的确认:删除事件侦听器

那个想法

我想了解删除带有事件侦听器的项目时的最佳实践。

例如:

我有一个滚动视图,其中包含许多子项。我想用不同的项目列表刷新滚动视图的内容。

滚动视图中包含的每个项目都附加了一个或多个事件监听器。

我应该在删除项目之前删除事件监听器吗?或删除项目是否会自动清除所有附加的事件侦听器?

我试图通过使主动侦听器不再存在的UI对象来确保不影响性能或内存消耗。

伯特·G。

好问题。内存在移动设备上是“珍贵的”(具有最好的Gollum口音),并且造成泄漏肯定是导致崩溃,星级降低和用户不满意的途径。关于添加/删除视图和关闭窗口时如何处理垃圾收集有一些误解。关闭窗口会清理子视图,使用该.remove()方法实际上会从内存中删除视图,等等。

在这个特殊的用例中,由于没有代码示例,因此我不得不推测一下如何创建子视图以及如何处理和设置事件侦听器,但是总的来说,这应该适用于大多数情况。

对于您的视图,我们假设您已经在Alloy视图文件中定义了ScrollView(id ='scrollView'),并且创建子视图的操作如下:

var subViews = [];

function _doSomething(){
    alert('Something!');
}

for(i=0;i<10;i++){
    var view = Ti.UI.createView({
        backgroundColor:"#ececec", 
        height:50, 
        width: Ti.UI.FILL});

    view.addEventListener('click', _doSomething);

    subViews.push(view);
    $.scrollView.add(view);
}

在上面的示例中,我们正在做一些事情:

1)我们创建一个数组来保存所有子视图,因此,如果我们需要引用一个特定的视图(啊哈,用于垃圾回收),我们可以

2)我们声明了事件函数,而不是与事件侦听器内联创建它,因此我们可以根据需要进行清理

现在,在任何用例中,我们都准备好管理此特定视图的内存。

现在假设您决定删除该特定ScrollView的所有视图,并使用类似以下内容的方法:

$.scrollView.removeAllChildren();

然后开始添加新视图。您的子视图消失了吗?那事件监听器呢?

答案-他们仍然闲逛。它易于检查,只需抛出

console.log(subViews.length);

在代码末尾,您用于添加视图(如上面的示例),您将看到类似这样的内容。

[INFO]  10
[INFO]  20
[INFO]  30
[INFO]  40
[INFO]  50
[INFO]  60
[INFO]  70

因此,有了这些信息,您现在应该对准备好摆脱子视图时如何清理子视图有了个好主意。这是一个示例:

function cleanUpSubViews(){
    while(subViews.length) {
        var v = subViews.pop();
        v.removeEventListener('click', _doSomething);
        v = null;
    };
}

通常,清理subViews应该清除事件侦听器,但是要确保我建议您在上面的代码中添加该行以确保对其进行处理。

您可以在此处查看工作示例:https : //gist.github.com/grantges/884ae6b2fd8570a89109

并且一定要查看我们有关“管理内存”的文档以及“最佳实践指南”,以获取更多有关此方面的信息和说明。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

最佳实践的确认:删除事件侦听器

来自分类Dev

在何处添加事件侦听器的最佳实践

来自分类Dev

Web应用程序的事件侦听器最佳实践

来自分类Dev

事件侦听器的最佳设计模式

来自分类Dev

无法删除(绑定的)事件侦听器

来自分类Dev

删除Dojo dGrid的事件侦听器

来自分类Dev

电子:删除beforeunload事件侦听器

来自分类Dev

Javascript删除“焦点”事件侦听器

来自分类Dev

无法删除(绑定的)事件侦听器

来自分类Dev

删除事件侦听器as3

来自分类Dev

无法删除事件侦听器

来自分类Dev

无法删除 touchmove 事件侦听器

来自分类Dev

删除元素上的事件侦听器的最佳方法是什么?

来自分类Dev

处理多个事件侦听器的最佳方法

来自分类Dev

删除元素还会删除其事件侦听器吗?

来自分类Dev

删除子功能事件侦听器

来自分类Dev

如何删除Aurelia中的事件侦听器?

来自分类Dev

无法删除CSS动画结束的事件侦听器

来自分类Dev

删除用于带节流功能的Scroll事件侦听器

来自分类Dev

reactjs事件侦听器beforeunload添加但未删除

来自分类Dev

如何删除在TypeScript中使用“ this”的事件侦听器?

来自分类Dev

更新或更改或删除/重置Javascript事件侦听器

来自分类Dev

无法删除事件侦听器TypeScript / OOP JavaScript

来自分类Dev

创建事件侦听器以从localStorage删除对象

来自分类Dev

删除一组事件侦听器

来自分类Dev

未删除事件侦听器-点亮的元素

来自分类Dev

useEffect不会删除我的事件侦听器

来自分类Dev

如何删除从各个要素动态创建的事件侦听器?

来自分类Dev

如何在EaselJS对象中删除事件侦听器