代码之家  ›  专栏  ›  技术社区  ›  user56512

如何阻止数据网格的第一行itemRenderer实例化/添加/初始化/etc两次?

  •  4
  • user56512  · 技术社区  · 17 年前

    在FlexDataGrid的第一行中,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>
    

    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>
    

    creationComplete:事件。目标=项目渲染器0.dg。..SimpleItemRenderer29.text输入,第2项 creationComplete:事件。目标=项目渲染器0.dg。..SimpleItemRenderer12.text输入,第1项

    3 回复  |  直到 17 年前
        2
  •  1
  •   Joel Hooks    17 年前

    我通常更喜欢做的是创建一个 .

    这允许我强烈地键入我的实际数据,保持Canvas(或其他容器)实现的关于ViewModel Renderer接口的机制不变,并确保数据被正确回收。

    我无法形容它有多有益 this series by Peter Ent on itemRenders

    推荐文章