【问题标题】:How to prevent itemRenderers from being replaced with new instances in Flex如何防止 itemRenderers 被 Flex 中的新实例替换
【发布时间】:2012-08-29 10:46:20
【问题描述】:

这个问题听起来很简单,只需将 virtualLayout 设置为 false,但这不是我想要的。

我遇到了以下情况。我的 Flex 移动应用程序具有预定义的容器,通常是应用程序总宽度的一半。用户可以最大化这些组件,以便它们占据所有可用宽度。

当然,对于在ListDataGroup 中显示数据的组件,渲染器必须调整大小。开箱即用,但我需要它们在组件最大化时显示附加信息。 为此,我创建了一个非常简单的方法来更新渲染器;

private function updateRenderer():void {
            _itemRenderer.properties = {isFullScreen: _isFullScreen, headerProperties:_headerProperties, visibleColumns:_visibleColumns, optimalColWidth:_optimalColWidth, grid:this.name, fids:_fids};
            _list.itemRenderer = _itemRenderer;
}

渲染器属性,例如 visibleColumns 会相应变化,并且由于渲染器在调整大小期间会自动失效,因此它们可以使用新属性重绘。

这很好,但不幸的是,新的渲染器是通过这种过程创建的,而不是简单地重用现有的渲染器并让它们自己重绘。

有没有办法改变这种行为,或者有人知道更好的方法来完成这样的任务吗?

【问题讨论】:

  • 这可能会导致性能问题和内存泄漏。为什么不使用状态?
  • 没有内存泄漏和性能方面我没有看到问题。您认为这种更新渲染器的方法存在哪些潜在缺陷?但你是对的,状态可能是更有效的解决方案,我对状态的唯一问题是改变它们的方式。我需要根据主机组件的大小调整渲染器,但数据对象保持完全相同,因此它不携带有关渲染器应该处于哪个状态的任何信息。
  • @AdrianPirvulescu,再三考虑,不能使用状态,因为渲染器属性是由外部组件动态设置的。渲染器属性例如标签及其大小,渲染器必须根据设置的属性创建标签,很像具有动态列的表格行。

标签: actionscript-3 apache-flex air flex4 itemrenderer


【解决方案1】:

如果我理解您显示的代码,它将替换 itemRenderer 属性;所以“预计”当这种情况发生时,所有现有的渲染器都将被销毁——因为它们是用“旧”渲染器创建的——然后用“新”渲染器的实例替换。

您可以考虑直接在渲染器上更改属性:

   (_list.itemRenderer as ClassFactory).properties = {isFullScreen: _isFullScreen, headerProperties:_headerProperties, visibleColumns:_visibleColumns, optimalColWidth:_optimalColWidth, grid:this.name, fids:_fids};

然后强制您的 dataProvider 刷新,以便在需要时重绘所有 itemRenderer:

(_list.dataProvider as ArrayCollection).refresh()

【讨论】:

  • 试过了(第一个也出现在我的脑海中),但不幸的是,我得到一个错误 1119:“错误:”1119:通过静态引用访问可能未定义的属性属性键入 mx.core:IFactory。”
  • 不幸的是,这也不起作用,在那个上得到一个referenceError:“无法创建属性”-我的渲染器属性之一-“在 spark.components.LabelItemRender”上,这很奇怪,因为我的自定义渲染器之前已经设置好了。
  • 此时,我需要一个可以证明问题的可运行示例。
  • 不审查框架代码;我假设在创建渲染器时发送属性;因此,您不会在现有渲染器上获得新属性。听起来你想要矛盾的东西;并且您可能必须扩展/修改代码才能将新属性发送到 itemRenderers,而不会在渲染器重新创建自己时导致屏幕“闪烁”。
  • @Al_Birdy 我认为您正在寻找的功能是非标准的。您正在将对象的创建卸载到第 3 方类(使用 ClassFactory 和 itemRenderers),并希望同一个第三方类来处理更新。我不会说您发现了 Flex 工作不正常的情况。不扩展 List 类;您可以扩展 ClassFactory 以跟踪它创建的组件并在它们更改时更新属性?你的工作是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多