4

在 Flex DataGrid 的第一行中,itemRenderer 将初始化两次。跟踪结果显示 flex 框架可能正在创建第一行的 itemRenderer 的两个实例。在一个更复杂的应用程序中,itemRenderer 包含一个数据绑定的 ColorPicker,我们看到由于这个问题而发生了无限循环。只有第一行的 itemRenderer 被初始化了两次。有没有办法覆盖 flex 的行为并阻止这种情况发生?下面的代码演示了这个问题:

主要应用:

<?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>

简单项目渲染器:

<?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=ItemRenderers0.dg...SimpleItemRenderer12.textInput,null 初始化:event.target=ItemRenderers0.dg...SimpleItemRenderer24.textInput,null 创建完成:event.target=ItemRenderers0.dg...SimpleItemRenderer24.textInput,项目 1 初始化:event.target=ItemRenderers0.dg...SimpleItemRenderer29.textInput,null creationComplete:event.target=ItemRenderers0.dg...SimpleItemRenderer29.textInput,项目 2 creationComplete:event.target=ItemRenderers0.dg...SimpleItemRenderer12 .textInput,第 1 项

4

3 回答 3

2

更新了 Peter Ent 在 itemRenders 上的系列链接

于 2009-08-25T18:35:50.427 回答
1

您的 itemRenderer 没有真正正确实施,这可能是您的问题的原因

被覆盖的 set data 方法应该设置 super.data = value。您不需要实现自己的 _data 属性,因为 Flex 容器实现了 IDataRenderer 并且已经拥有它。我认为,如果不运行您的代码,您就会遇到缓存/回收问题。

我通常更喜欢做的是创建一个[Bindable] 私有 myProperty:Object(通常是扩展 EventDispatcher 的自定义 MyObjectVO)。然后,在我的设置数据方法中,我将设置super.data = value后跟if(value!=null) myProperty=value

这允许我强输入我的实际数据,保持与 Canvas(或其他容器)实现的 IDataRenderer 接口相关的机制完好无损,并确保数据被正确回收。

初始化广告创建完成是 itemRenderers 中的不良事件,因为它们实际上是被回收的,而且这些方法的行为不像人们期望或希望的那样。

我无法表达Peter Ent 在 itemRenders 上的这个系列对我有多么有益。

于 2009-04-25T01:16:06.110 回答
0

嗯,他是对的,我有同样的错误,第一个 itemRenderer 被调用了两次,你可以在官方论坛看到我的帖子:

http://forums.adobe.com/thread/604259

并在这里填写了一个错误:

https://bugs.adobe.com/jira/browse/SDK-26010

于 2010-03-25T23:55:10.360 回答