Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 如何停止datagrid';是否从实例化/添加/初始化/etc两次中删除第一行itemRenderer?_Apache Flex_Actionscript 3_Flex3_Mxml_Itemrenderer - Fatal编程技术网

Apache flex 如何停止datagrid';是否从实例化/添加/初始化/etc两次中删除第一行itemRenderer?

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

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

缩略输出:

初始化: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中很糟糕,因为它们实际上是循环使用的,而且这些方法的行为并不像人们期望的或希望的那样。”还有什么替代方案?