2

我有一个简单的 ItemRenderer,当我在 Spark 产品列表中使用它时会导致奇怪的行为。定义如下:

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark" 
  xmlns:mx="library://ns.adobe.com/flex/mx"
  creationComplete="setProduct()">

  <fx:Script>
    <![CDATA[

      [Bindable]
      private var p:MyProduct;

      private function setProduct():void
      {
        p = data as MyProduct;
      }

    ]]>
  </fx:Script>

  <s:Label text="{p.name}" paddingTop="6" paddingBottom="4"
    color="{p.active ? Constants.BLACK : Constants.DISABLED_COLOR}"
    fontStyle="{p.active ? 'normal' : FontStyle.ITALIC}"/>

</s:ItemRenderer>

它与 List 的默认 ItemRenderer 基本相同。我决定使用该变量p,这样我就不必(data as MyProduct)在标签绑定中一遍又一遍地编写(这在更大、更复杂的 ItemRenderer 中尤其麻烦)。

它导致的行为似乎“反转”了显示的项目,但项目的实际顺序保持不变。当产品使用新值更新时会发生这种情况。例如,我将有一个产品列表A B C D。如果我更新其中任何一个的属性,则 List 会将顺序更改为show D C B A。但是如果我点击这个反向列表中的产品 D,它仍然会“加载”产品 A。 这篇文章描述了一个类似的问题,但没有包含代码,所以我不确定它是否完全相同。

我将此错误跟踪到使用变量p. 如果我只是(data as MyProduct)在标签绑定中使用,它可以正常工作。如果我从上面的链接中获取示例并setProduct()在事件上运行该方法dataChange,那么错误就会消失并按预期工作。但是,我不相信这不仅仅是巧合。

有没有其他人经历过这样的事情?问题是否与使用事件直接相关creationComplete?我在想这可能creationComplete只开火一次,就把一切都搞砸了。不确定这与列表反转显示的产品有什么关系。

4

2 回答 2

3

这可能是由于项目渲染器被回收。我会覆盖数据设置器而不是使用creationComplete,这样您就可以确保捕获对数据的更改。

override public function set data(value : Object) : void {
    super.data = value;
    p = value as MyProduct;
}
于 2013-04-17T18:54:01.220 回答
1

有几件事。首先,如果您有要设置的值对象,那么我通常会在我的设置数据代码中进行设置。

override public function set data( value:OBject ):void
{
  super.data = value;
  p = value as MyProduct;
}

但与我认为真正的问题相比,这是相对较小的豆子。方括号表示该属性绑定到该对象/对象链。所以我们不得不问,这个语句中绑定的对象是什么?

"{p.active ? 'normal' : FontStyle.ITALIC}"

我并不是说它不应该起作用,但我们希望尽可能多地消除错误。所以如果我是你,我的代码应该是这样的。

[Bindable] public var fonstStyle:String;
[Bindable] public var color:int;
[Bindable] public var name:String;
private var _p:MyProduct;

override public function set data( value:OBject ):void
{
  super.data = value;
  _p = value as MyProduct;
  fonstStyle = _p.active ? 'normal' : FontStyle.ITALIC;
  color = _p.active ? Constants.BLACK : Constants.DISABLED_COLOR;
  name = _p.name;
}

我也会摆脱那个“creationComplete”事件监听器。使用 ItemRenderers 时,任何基于数据的属性设置都应通过“设置数据”功能完成。

现在我查看了您的代码,您的渲染器可能在通过“creationComplete”创建之后设置了这些变量,然后它们没有被更新。

于 2013-04-18T01:04:54.003 回答