【问题标题】:Flex Repeaters and EventListenersFlex 中继器和事件监听器
【发布时间】:2009-01-30 06:43:47
【问题描述】:

乍一看,Repeater 控件看起来非常强大,但现在我重新考虑了。

手头的问题: 为孩子添加事件监听器

Repeater 对象绑定到 ArrayCollection 并对其进行迭代,为每个项目创建新的 Vbox 子项。现在对于每个孩子,Repeater 对象将触发一个“重复”事件,我很想在其中添加事件监听器(用于鼠标事件)。到目前为止没有问题,但是,当 ArrayCollection 发生变化时会发生什么,我应该如何删除所有老孩子的 EventListeners?是否有包含我在文档中跳过的 Vbox 实例的子数组?当事件监听器附加到的对象被销毁时,它们会被很好地清理吗?

-C coder 在 flex/actionscript 中丢失

【问题讨论】:

    标签: apache-flex actionscript-3


    【解决方案1】:

    我会完全避免使用中继器。从性能的角度来看,它们非常慢,因为这些项目经常被销毁和重新创建。您最好使用基于列表的控件并实现 itemRenderer。

    默认情况下,事件监听器是强引用,所以如果你不移除你的事件监听器,它会阻止对象被垃圾回收。您可以在 addEventListener 中使用名为“weakReference”的可选第 5 个参数,并将值设置为 true 以添加不会阻止 GC 的事件侦听器。

    为了更好地处理 itemRender 组件中的事件,您可以实现 IDropInListItemRenderer 接口。这将使您可以访问具有“所有者”属性的“listData”,该属性是实际的 List 对象本身。在您的 itemRenderer 中,通过所有者调度包含必要数据的自定义事件。如果在 List 控件创建后添加事件侦听器,则可以在包含该控件的组件中进行事件处理。

    【讨论】:

    • +1 用于提及弱裁判,我同意——重复者很痛苦;我还没有找到一个令人信服的理由来选择它们而不是更通用的同类产品。
    • Repeater 的 recycleChildren 属性是否减轻了部分性能损失?
    • 问题是Repeater 会立即创建它的所有子元素,而List 只会创建屏幕上可见的内容(加上一些额外的内容以在用户滚动时充当“缓冲区” )。如果您有一个大型集合,那么预先实例化所有这些将非常昂贵。同样来自“recycleChildren”的文档:将其设置为 true 可以提高性能,但并不适用于所有情况。例如,如果之前创建的孩子有用户输入的文本等状态信息,那么当孩子被回收时,这个状态不会被重置。
    【解决方案2】:

    好的,看来我需要给 vbox 一个 id,之后我就能够以 vbox 数组的形式访问该 id。添加事件处理程序后,我能够使用事件的 currentTarget.getRepeaterItem() 作为对 ArrayCollection 中对象的引用。

    通过循环遍历 vbox 数组并删除处理程序来清理事件处理程序。

    不太担心性能,因为项目很少,而且它们很少随着程序运行而改变,尽管这些项目几乎每次运行都会有所不同。除非它不必要地破坏和重建物品,否则应该不是什么大问题。

    【讨论】:

    • 很高兴你知道了。 :) 我认为无论如何学习 List/itemRenderer 方法都是值得的。我正在更新一个应用程序,该应用程序需要大约 10 秒来使用中继器呈现 40 个项目,并使用 List + itemRenderer 将其减少到大约 100 毫秒。这是要走的路。 :)
    • 哇 :( 好的,我一定会调查的。谢谢。
    • 中继器的优点之一是当您想在组件中使用单选按钮时。并不是说您不能使用列表/渲染器解决方案来做到这一点。它开箱即用。
    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2020-11-29
    • 2019-12-02
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多