Apache flex 火花项目渲染器“;速记;引起奇怪行为的
我有一个简单的ItemRenderer,当我在Spark产品列表中使用它时,它会导致奇怪的行为。其定义如下: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
<?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”创建这些变量之后设置这些变量,然后它们就不会被更新了