`

谈谈Flex中ArrayCollection的复制(克隆)

阅读更多

      在Flex的开发过程中,常常会遇到复制ArrayCollection的情况。以前只是从网上找个方法拿来就用,也没有具体的搞清楚所以然来。今天有时间,研究了一下,总结如下:

        Flex中的复制同java一样,也分为深复制和浅复制。(如果您对java的深复制和浅复制理解不深的话,可以参考我前一篇文章:JAVA中浅复制与深复制

        下面总结一下ArrayCollection的浅复制,共有4种方法:

        1、var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

        2、var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

        3、var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

        4、var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

        以上方法中,第一种方法由于不是创建的独立的ArrayCollection对象,所以不推荐使用。第二、三、四种方法相似,可以参考使用。

        有的时候,我们也会用到深复制,方法如下:

        var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

        this.clone()方法定义如下:

         function clone(source:Object):*
         {
                var myBA:ByteArray = new ByteArray();
                myBA.writeObject(source);
                myBA.position = 0;
                return(myBA.readObject());
         }

下面是我测试以上程序的Flex程序代码,大家可以参考:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()" layout="absolute">
    <mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.collections.ListCollectionView;
        import mx.controls.Alert;
        import flash.utils.ByteArray;
        
        
        public function initApp():void
        {            
        }
        
        
        //开始测试:
        //浅复制1
        private function test1():void
        {
            //初始化需要的对象
            var obj1:Object=new Object();//定义对象obj1
            var obj11:Object=new Object();//定义对象obj1的引用对象obj11
            obj1.name="obj1.name";
            obj1.sub=obj11;//obj1的sub属性引用obj11
            obj11.name="obj11.name";            
            //实例化ArrayCollection对象,并将obj1添加进该对象
            var oldArray:ArrayCollection=new ArrayCollection();
            oldArray.addItem(obj1);
            
            //浅复制ArrayCollection
            var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);
            
            //修改obj11.name的值
            obj11.name="obj11.name is changed!";
            
            //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
            Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
        }
        //浅复制2
        private function test2():void
        {
            //初始化需要的对象
            var obj1:Object=new Object();//定义对象obj1
            var obj11:Object=new Object();//定义对象obj1的引用对象obj11
            obj1.name="obj1.name";
            obj1.sub=obj11;//obj1的sub属性引用obj11
            obj11.name="obj11.name";            
            //实例化ArrayCollection对象,并将obj1添加进该对象
            var oldArray:ArrayCollection=new ArrayCollection();
            oldArray.addItem(obj1);
            
            //浅复制ArrayCollection
            var newArray:ArrayCollection=new ArrayCollection(oldArray.source);
            
            //修改obj11.name的值
            obj11.name="obj11.name is changed!";
            
            //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
            Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
        }
        
        //浅复制3
        private function test3():void
        {
            //初始化需要的对象
            var obj1:Object=new Object();//定义对象obj1
            var obj11:Object=new Object();//定义对象obj1的引用对象obj11
            obj1.name="obj1.name";
            obj1.sub=obj11;//obj1的sub属性引用obj11
            obj11.name="obj11.name";            
            //实例化ArrayCollection对象,并将obj1添加进该对象
            var oldArray:ArrayCollection=new ArrayCollection();
            oldArray.addItem(obj1);
            
            //浅复制ArrayCollection
            var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());
            
            //修改obj11.name的值
            obj11.name="obj11.name is changed!";
            
            //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
            Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
        }
        
        //浅复制4
        private function test4():void
        {
            //初始化需要的对象
            var obj1:Object=new Object();//定义对象obj1
            var obj11:Object=new Object();//定义对象obj1的引用对象obj11
            obj1.name="obj1.name";
            obj1.sub=obj11;//obj1的sub属性引用obj11
            obj11.name="obj11.name";            
            //实例化ArrayCollection对象,并将obj1添加进该对象
            var oldArray:ArrayCollection=new ArrayCollection();
            oldArray.addItem(obj1);
            
            //浅复制ArrayCollection
            var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());
            
            //修改obj11.name的值
            obj11.name="obj11.name is changed!";
            
            //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
            Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
        }
        
        //深复制
        private function test5():void
        {
            //初始化需要的对象
            var obj1:Object=new Object();//定义对象obj1
            var obj11:Object=new Object();//定义对象obj1的引用对象obj11
            obj1.name="obj1.name";
            obj1.sub=obj11;//obj1的sub属性引用obj11
            obj11.name="obj11.name";            
            //实例化ArrayCollection对象,并将obj1添加进该对象
            var oldArray:ArrayCollection=new ArrayCollection();
            oldArray.addItem(obj1);
            
            //浅复制ArrayCollection
            var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));
            
            //修改obj11.name的值
            obj11.name="obj11.name is changed!";
            
            //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
            Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
        }
        
        //深复制调用的方法
        function clone(source:Object):*
        {
            var myBA:ByteArray = new ByteArray();
            myBA.writeObject(source);
            myBA.position = 0;
            return(myBA.readObject());
        }
    ]]>
    </mx:Script>
    <mx:Button label="第一种浅复制方法" click="test1()" x="61" y="36"/>
    <mx:Button label="第二种浅复制方法" click="test2()" y="57" x="61" width="114"/>
    <mx:Button label="第三种浅复制方法" click="test3()" y="78" x="61" width="114"/>
    <mx:Button label="第四种浅复制方法" click="test4()" y="98" x="61" width="114"/>
    
    <mx:Button label="深复制方法" click="test5()" y="147" x="61"/>
</mx:Application>

 

分享到:
评论

相关推荐

    Flex:ArrayCollection转xml形式的实例

    另一方面,如果从服务器接收XML数据,也可以通过反向操作将XML转换为ArrayCollection,以便在Flex或Flash应用中使用。 在实际项目中,你可能还需要考虑更多细节,如XML的命名空间管理、属性的添加以及错误处理等。...

    Flex的Array和ArrayCollection

    Flex的Array和ArrayCollection

    Flex Tree 通过Arraycollection转化为XML数据源,新增、删除、修改功能的整合

    在Flex中,Tree组件是一种常用的控件,用于显示层次结构的数据。本篇文章将聚焦于如何将ArrayCollection转换为XML数据源,并实现Flex Tree组件的新增、删除和修改功能。以下是详细的解释和步骤。 首先,...

    用ArrayCollection当做flex中Tree控件的DataProvider

    本文将详细探讨如何使用`ArrayCollection`作为Flex中的`Tree`控件的数据提供者,以替代通常使用的XML数据源。 首先,让我们理解`ArrayCollection`的概念。`ArrayCollection`是Flex中的一个类,它继承自`...

    ArrayCollection求最大值,最小值,排序

    在IT行业中,ArrayCollection是ActionScript 3.0和Flex框架中的一个重要数据结构,它扩展了Array类,提供了对数据的双向绑定和事件通知功能。ArrayCollection不仅支持数组的操作,还具备列表的数据管理特性,因此在...

    ArrayCollection不完全绑定

    在Flex编程中,ArrayCollection是一种常用的集合类,它继承自Array类并添加了对数据绑定的支持。然而,尽管...通过对这些问题的深入理解和解决,可以更好地掌握Flex中的数据绑定和ArrayCollection的使用。

    flex中Datagride嵌套checkbox

    1. **定义数据模型**:在Flex中,数据通常是通过ArrayCollection或XMLListCollection等数据集合类来表示的。你需要创建一个包含复选框状态的属性,例如`isSelected`,并在数据项中设置这个属性。 2. **自定义列**:...

    FLEX ArrayCollection删除过滤的数据问题解决

    在Flex开发中,ArrayCollection是一种常用的集合类,它继承自Array并添加了对数据绑定和事件处理的支持。然而,当ArrayCollection应用了过滤器后,直接使用`removeItemAt()`方法尝试删除过滤后的数据可能会遇到问题...

    Flex中组件datagrid导出Excel

    本主题将深入探讨如何在Flex中实现组件DataGrid的数据导出功能,使其能够生成Excel文件供用户下载和处理。 DataGrid是Flex中常用的一个组件,它用于展示结构化数据,通常用于表格形式的展示。在Flex中,我们可以...

    12条常用Flex代码 值得收藏

    在Flex应用程序中,经常需要复制一个ArrayCollection对象,以便在不同的上下文中使用。使用`var bar:ArrayCollection = new ArrayCollection(); for each ( var i:Object in ac ){ bar.addItem( i ); }`语句可以实现...

    flex 拖拽功能 中文文档

    本文旨在深入探讨Flex中的拖拽功能,包括其工作原理、关键概念、以及如何在实际项目中运用这些功能。 #### 拖放操作的三个阶段 拖放操作主要分为三个阶段:**初始化(Initiation)**、**拖动(Dragging)** 和 **...

    Flex 编程技巧

    在Flex中,可以通过ActionScript代码复制内容到剪贴板。使用System.setClipboard(strContent)方法,其中strContent是你想要复制到剪贴板的字符串内容。 2. 复制一个ArrayCollection 复制ArrayCollection对象时,...

    flex显示数据库数据

    ArrayCollection是Flex中的一个动态数组,它可以被用作各种UI组件的数据源。 集成流程大致如下: 1. 配置Myeclipse 9.0:确保已经安装了Flex SDK和BlazeDS插件,这样可以在IDE内创建Flex项目并与Java项目一起工作...

    FLEX中下拉框嵌入Checkbox

    本文将详细讲解如何在Flex中的ComboBox中嵌入Checkbox,并探讨相关的技术细节。 首先,理解Flex的基础是关键。Flex是Adobe开发的一种基于ActionScript的开放源代码框架,用于构建富互联网应用程序(RIA)。它利用...

    flex操作数据库, flex操作本地sql数据库

    在Flex中,可以利用各种技术来实现与数据库的交互,包括操作本地SQL数据库。本篇文章将详细探讨Flex如何操作数据库,特别是针对本地SQL数据库的处理。 一、Flex与数据库连接 在Flex中,数据访问通常通过ADO.NET、...

    Flex Tree 中Checkbox

    4. **数据模型与视图**:在Flex中,数据模型与视图是分离的。当Checkbox的状态改变时,我们需要更新与之对应的树节点数据对象的属性,这样即使在数据刷新或重绘后,也能保持正确的选择状态。 5. **事件处理**:实现...

    flex实时更新曲线图

    在本例中,"flex实时更新曲线图"涉及到的技术核心是Flex中的图表组件和数据驱动更新。 1. **Flex图表组件**:Flex提供了多种图表类型,包括折线图、柱状图、饼图等。曲线图,即折线图,用于展示数据随时间变化的...

    flex组件LIST使用

    在Flex中,`ArrayCollection`是用于管理列表数据的一种常见方式。它不仅提供了基本的数据存储功能,还支持事件通知、排序和过滤等功能,非常适合用作`List`组件的数据源。示例中的`myDP`变量即为一个`...

    Flex如何让前台链接后并访问数据库

    本篇文章将详细探讨如何在Flex中实现前台与后台的链接,并连接到数据库。 首先,我们需要了解Flex中的数据绑定机制。在Flex中,数据绑定允许我们将界面组件(如按钮、文本输入框等)的状态直接与应用程序的数据模型...

Global site tag (gtag.js) - Google Analytics