集合(ArrayCollection)的复制

利用Flex SDK自带的mx.utils.ObjectUtil类的copy方法就可以复制集合,

但复制后的集合无法识别里面数据的数据类型,这里需要利用 flash.net.registerClassAlias方法

对集合里德数据类型进行注册。具体方法如下:

/**
* 复制对象,对象属性中可以是对象,对象中的对象如果未初始化则无法注册类型。 
* @param objToCopy 要复制的对象
* @param registerAlias 是注册数据类型
* @return 转换后的对象
* 
* objToCopy[arr[i]]所指向的对象没有初始化时,objToCopy[arr[i]] is Object返回是false,否则返回true
*/
public static function copyOverObject(objToCopy:Object, registerAlias:Boolean = false):Object
{
	if (registerAlias)
	{
		var className:String;
		var arr:Array = ObjectUtil.getClassInfo(objToCopy).properties;

		for(var i:int = 0;i<arr.length;i++)
		{
			if( objToCopy[arr[i]] is String||
				objToCopy[arr[i]] is int||
				objToCopy[arr[i]] is uint||
				objToCopy[arr[i]] is Number||
				objToCopy[arr[i]] is Boolean)
			continue;
			try
			{
				className = ObjectUtil.getClassInfo(objToCopy[arr[i]]).name;
				registerClassAlias(className,getDefinitionByName(className) as Class)
			}
			catch(e:Error)
			{
				//objToCopy[arr[i]]==null;
				//trace("属性:"+arr[i]+" 值为null,无法注册类型!");

			}
		}
		className = getQualifiedClassName(objToCopy);
		registerClassAlias(className,getDefinitionByName(className) as Class);
	}
	return ObjectUtil.copy(objToCopy);
}

说明:

   这个方法能复制的对象的属性可以是一个复杂的对象类型,如:

     o = {};

     o.p={"a":"b","c":"d"};//可以复制对象o

  但此对象属性的属性不能再是复杂的对象类型,将无法复制,如:

     o = {};

     t = {{"x":1},"y":2};

     o.p=t;//无法复制对象o

 

想要复制后面一种情况可以换一种思路去解决,后面再贴了!有了上面的方法,要复制集合就很简单了。

  1。将集合的source属性(一个数组)取出,遍历复制数组中的每个元素,并生成一个新的数组。

  2。定义个新的集合,将上面的新数组赋值给新集合的source属性。

 

posted @ 2010-05-10 00:10  ywxgod  阅读(1142)  评论(0编辑  收藏  举报