【问题标题】:Getting a list of the rendered items获取渲染项目的列表
【发布时间】:2012-10-20 01:06:57
【问题描述】:

我有自己的自定义组件。该组件从一个基本容器扩展而来。我希望能够访问正在可视化的 itemRenderer 实例。我知道组件 mx:list 有一个内部 getter,它提供一个数组数组,其中包含呈现每个数据提供程序项的 itemRenderer 实例。我想要同样的东西。知道如何做到这一点吗?

更具体地说:我正在将我的 dataProvider 项的 selected 属性设置为 true 或 false。从我的 ItemRenderer 的 updateDisplayList 函数中,我检查属性的更改并更正所选属性的边框颜色。不幸的是,我必须强制使用 updateDisplayList 函数。我已经在列表中的 ItemRenderer 上做过一次。只有列表才是实用的,因为通过制作我自己的列表,我能够获得正在渲染的项目列表,因此可视化(不能很多)。通过渲染的 Items 和 updateDisplayList 没有开销。但在这种情况下,我可以有 100 个项目。想象一下检查和更改这么多项目的样式。谢谢

【问题讨论】:

  • 在 Flex 3 中,Container、VBox、HBox 和 Canvas 等容器类不使用项目渲染器。只有基于列表的控件可以(List、HorizontalList、DataGrid 等)。容器类仅呈现添加到它们的子对象。在 Flex 4 中有一个使用项目渲染器的 DataGroup 容器类,但在 Flex 3 中没有这样的容器。
  • 这里的问题是你为什么要访问渲染器?你需要让渲染器做他们最擅长的事情,那就是渲染。没有什么是您无法从控件和数据提供者的组合中计算出来的。

标签: actionscript-3 apache-flex flex3


【解决方案1】:

Flex 架构师故意让这件事变得困难,因为他们正确地封装了组件。简而言之,即使尝试这样做也违反了良好的 OOP 原则。

也就是说,您可能尝试做的大约 90% 的事情可以通过操作数据项来完成,剩下的 10% 可以通过为您的 itemRenderer 使用 ClassFactory 来完成,该 ClassFactory 在您的 itemRenderer 上设置自定义属性到一个回调,您可以在其中查看包含上下文可用的数据并根据该数据返回一个值。

如果你详细说明你的最终目标,我可以给你更多细节。


根据澄清进行编辑:

您需要让您的数据对象类在事件发生更改时调度一个事件(一种方法是使其可绑定,或者只是使选定的属性可绑定)。然后,在您的渲染器中,侦听更改事件并采取适当的措施。

处理此问题的第二种方法是刷新()集合,首先存储 selectedItem(如果您关心的话)并在刷新完成后重置它。

【讨论】:

  • 我详细阐述了我的问题,您可以在上面阅读。现在我正在浏览 itemRenderers 的完整列表并使显示列表无效。但我只想对可视化的人这样做。通过基于 Adob​​e mx:List 制作我自己的列表,我能够访问 listItems,它是一个内部变量,它完全包含:实际渲染项目的列表。实际上,可视化的项目数量永远不会那么多。但是对于基于容器的组件,我不知道如何。谢谢
【解决方案2】:

我相信您可以通过 getChildAt 方法访问 itemRenderer 实例。 Flex 3 的容器覆盖了“getChildAt”、“numChildren”,因为有些子项是逻辑子项,而有些是装饰性子项,例如背景、边框和滚动条。

请记住,itemRenderer 可能不会在 dataProvider 分配时立即可用,因为它们可能会在下一个组件生命周期中创建。检查底层容器的文档,找出当渲染器确实创建时要监听的事件,以便您可以可靠地访问它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    相关资源
    最近更新 更多