Apache flex 火花项目渲染器“;速记;引起奇怪行为的

Apache flex 火花项目渲染器“;速记;引起奇怪行为的,apache-flex,flex4,behavior,itemrenderer,Apache Flex,Flex4,Behavior,Itemrenderer,我有一个简单的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

我有一个简单的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>

它基本上与列表的默认ItemRenderer相同。我决定使用变量
p
,这样我就不必在标签绑定中反复编写
(数据作为MyProduct)
(这在更大、更复杂的ItemRenderer中尤其麻烦)

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

我通过变量
p
找到了这个bug。如果我只是在标签绑定中使用
(数据作为MyProduct)
,它就可以正常工作。如果我从上面的链接中获取示例,并在
dataChange
事件上运行
setProduct()
方法,那么bug就会消失,并按预期工作。然而,我不相信这不仅仅是巧合


还有其他人经历过这样的事情吗?问题是否与使用
creationComplete
事件直接相关?我在想,也许
creationComplete
只发射了一次,把一切都搞乱了。但不确定这些与列表中显示的产品有什么关系。

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

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

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

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

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

override public function set data( value:OBject ):void
{
  super.data = value;
  p = value as MyProduct;
}
但与我认为真正的问题相比,这是相对较小的问题。括号表示属性绑定到该对象/对象链。所以我们不得不问,在这个陈述中,对象是什么

"{p.active ? 'normal' : FontStyle.ITALIC}"
我并不是说它不应该工作,但我们希望尽可能多地找出bug。如果我是你,我的代码会是这样的

[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”事件监听器。使用ItemRenders时,任何基于数据的属性设置都应通过“设置数据”功能完成


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

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

override public function set data( value:OBject ):void
{
  super.data = value;
  p = value as MyProduct;
}
但与我认为真正的问题相比,这是相对较小的问题。括号表示属性绑定到该对象/对象链。所以我们不得不问,在这个陈述中,对象是什么

"{p.active ? 'normal' : FontStyle.ITALIC}"
我并不是说它不应该工作,但我们希望尽可能多地找出bug。如果我是你,我的代码会是这样的

[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”事件监听器。使用ItemRenders时,任何基于数据的属性设置都应通过“设置数据”功能完成

现在我看一下您的代码,您的呈现程序可能在通过“creationComplete”创建这些变量之后设置这些变量,然后它们就不会被更新了