Apache flex 如何停止datagrid';是否从实例化/添加/初始化/etc两次中删除第一行itemRenderer?
在FlexDataGrid的第一行中,itemRenderer将初始化两次。跟踪结果表明flex框架可能正在创建第一行itemRenderer的两个实例。在一个更复杂的应用程序中,itemRenderer包含一个数据绑定的ColorPicker,我们看到由于这个问题出现了一个无限循环。只有第一行的itemRenderer被初始化两次。有没有办法覆盖flex的行为并阻止这种情况发生?以下代码演示了该问题: 主要用途:Apache flex 如何停止datagrid';是否从实例化/添加/初始化/etc两次中删除第一行itemRenderer?,apache-flex,actionscript-3,flex3,mxml,itemrenderer,Apache Flex,Actionscript 3,Flex3,Mxml,Itemrenderer,在FlexDataGrid的第一行中,itemRenderer将初始化两次。跟踪结果表明flex框架可能正在创建第一行itemRenderer的两个实例。在一个更复杂的应用程序中,itemRenderer包含一个数据绑定的ColorPicker,我们看到由于这个问题出现了一个无限循环。只有第一行的itemRenderer被初始化两次。有没有办法覆盖flex的行为并阻止这种情况发生?以下代码演示了该问题: 主要用途: <?xml version="1.0" encoding="utf-8"?
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="on_initialize(event);">
<mx:Script>
<![CDATA[
/**
* This experiment shows how the first row's itemrenderer is instantiated/added/initialized twice.
* We've never even noticed this before we found that a data-bound ColorPicker enters a infinite
* loop when it is within an itemRenderer.
*/
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
private var dg_array:Array;
private var dg_arrayCollection:ArrayCollection;
private function on_initialize(event:FlexEvent):void {
dg_array = new Array();
dg_arrayCollection = new ArrayCollection();
dg_arrayCollection.addItem("item 1");
dg_arrayCollection.addItem("item 2");
dg.dataProvider = dg_arrayCollection;
}
]]>
</mx:Script>
<mx:DataGrid id="dg" width="100%" height="100%" rowCount="5">
<mx:columns>
<mx:DataGridColumn headerText="Name" itemRenderer="SimpleItemRenderer"/>
</mx:columns>
</mx:DataGrid>
</mx:Application>
SimpleItemRenderer:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" initialize="//on_initialize(event);">
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
[Bindable]
override public function set data(value:Object):void { _data = value; }
override public function get data():Object { return _data; }
private var _data:Object;
private function on_initialize_textInput(event:FlexEvent):void {
trace("initialize:event.target="+event.target+", " + _data); // runs twice, for the first item only
}
private function on_creationComplete_textInput(event:FlexEvent):void {
trace("creationComplete:event.target="+event.target+", " + _data); // runs twice, for the first item only
}
]]>
</mx:Script>
<mx:TextInput text="{data}" id="textInput" initialize="on_initialize_textInput(event);" creationComplete="on_creationComplete_textInput(event);"/>
</mx:Canvas>
缩略输出:
初始化:event.target=ItemRenders0.dg…SimpleItemRender12.textInput,null
初始化:event.target=ItemRenders0.dg…SimpleItemRender24.textInput,null
creationComplete:event.target=ItemRenders0.dg…SimpleItemRender24.textInput,项目1
初始化:event.target=ItemRenders0.dg…SimpleItemRender29.textInput,null
creationComplete:event.target=ItemRenders0.dg…SimpleItemRender29.textInput,项目2
creationComplete:event.target=ItemRenders0.dg…SimpleItemRender12.textInput,第1项您的itemRenderer没有真正正确实现,这可能是您出现问题的原因 重写的set data方法应设置super.data=value。您不需要实现自己的_数据属性,因为Flex容器实现了IDataRenderer,并且已经拥有了它。我认为,如果不运行代码,您就会遇到缓存/回收的问题 我通常喜欢做的是创建一个[Bindable]私有myProperty:Object(通常是扩展EventDispatcher的自定义MyObjectVO)。然后,在我的set data方法中,我将设置super.data=value,然后设置if(value!=null)myProperty=value 这使我能够强烈地键入实际数据,保留画布(或其他容器)实现的IDataRenderer接口的机制不变,并确保数据被正确回收
Initialize ad creationComplete在ItemRenders中很糟糕,因为它们实际上是循环使用的,并且这些方法的行为不像人们期望或希望的那样
我无法表达它对我有多大的好处。他是对的,我有同样的错误,第一个项目渲染器被调用了两次,你可以在这里的官方论坛上看到我的帖子: 这里填充了一个bug:
我看到正在创建三个不同的对象。您确定第一项是重复的吗?您能提供跟踪的输出吗?真正有用的是在initialize方法中放置一个断点,并查看两次运行的对应堆栈。这可能会让我对init发生两次的方式或原因有一些了解。我确实尝试过在initialize方法中设置断点,但这对我帮助不大,因为我还不熟悉相当大的Flex框架的内部结构。在浏览了超过一百行的Adobe代码之后,我放弃了。你把这个记录到Adobe的缺陷跟踪系统了吗?我在那里发现一个项目可能与您的问题相同:。您可能需要将您的清除STR添加到此。Cheers“Initialize ad creationComplete在ItemRenders中很糟糕,因为它们实际上是循环使用的,而且这些方法的行为并不像人们期望的或希望的那样。”还有什么替代方案?