In the AS3 world, there might be numerous situations that requires you to create a clone of a very complex component of object. However it will be kinda crazy if you are going to run a loop and copy all the variables one by one. Therefore here's a class that will help you to reduce the amount of work needed.
Here's our main Application Class - SimpleCopyingOfObjects.mxml<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" backgroundColor="#CDCDCD" creationComplete="creationCompleteEvent(event)"> <fx:Script> <![CDATA[ import flash.net.*; import flash.utils.*; import mx.collections.ArrayCollection; import mx.events.FlexEvent; import mx.utils.ObjectUtil; import view.CustomComponent; protected function creationCompleteEvent(event:FlexEvent):void { //Creating 2 new CustomComponent and assign some //values to it. var tempObj:CustomComponent = new CustomComponent(); var tempObj1:CustomComponent = new CustomComponent(); tempObj.message = "I'm am a new View."; tempObj1.message = "I'm am a new View1."; tempObj.myContent.addItem(tempObj1); //Now let's create some clones. var tempClone1 = cloneObject(tempObj); var tempClone2 = cloneCustomObject(tempObj); txtMsg.appendText("tempObj is: " + getQualifiedClassName(tempObj)); txtMsg.appendText("\ntempClone1 is: " + getQualifiedClassName(tempClone1)); txtMsg.appendText("\ntempClone2 is: " + getQualifiedClassName(tempClone2)); txtMsg.appendText("\n\nValue of tempObj.message is: " + tempObj.message); if(tempClone1.hasOwnProperty("message")) { txtMsg.appendText("\nValue of tempClone1.message is: "+ tempClone1.message); }else{ txtMsg.appendText("\nValue of tempClone1.message is " + "unaccessible."); } if(tempClone2.hasOwnProperty("message")) { txtMsg.appendText("\nValue of tempClone2.message is: "+ tempClone2.message); }else{ txtMsg.appendText("\nValue of tempClone2.message is " + "unaccessible."); } tempObj.message = "I'm am a old View."; txtMsg.appendText("\n\nChange Value of tempObj.message "+ "to 'I'm am a old View.'"); txtMsg.appendText("\nValue of tempObj.message is: "+ tempObj.message); if(tempClone1.hasOwnProperty("message")) { txtMsg.appendText("\nValue of tempClone1.message is: "+ tempClone1.message); }else{ txtMsg.appendText("\nValue of tempClone1.message is " + "unaccessible."); } if(tempClone2.hasOwnProperty("message")) { txtMsg.appendText("\nValue of tempClone2.message is: "+ tempClone2.message); }else{ txtMsg.appendText("\nValue of tempClone2.message is " + "unaccessible."); } tempObj1.message = "I'm am a old View1."; txtMsg.appendText("\n\nChange Value of tempObj1.message "+ "to 'I'm am a old View1.'"); var tempObject:CustomComponent = CustomComponent( tempObj.myContent.getItemAt(0)); txtMsg.appendText("\nValue of tempObj.myContent." + "getItemAt(0).message is: " + tempObject.message); if(tempClone1.myContent is ArrayCollection) { if(tempClone1.myContent.getItemAt(0) is CustomComponent) { tempObject = CustomComponent( tempClone1.myContent.getItemAt(0)); txtMsg.appendText("\nValue of tempClone1.myContent." + "getItemAt(0).message is: " + tempObject.message); }else{ txtMsg.appendText("\nValue of tempClone1.myContent." + "getItemAt(0) is not a CustomComponent."); } }else{ txtMsg.appendText("\nValue of tempClone1.myContent" + "getItemAt(0) is unaccessible."); } if(tempClone2.myContent is ArrayCollection) { if(tempClone2.myContent.getItemAt(0) is CustomComponent) { tempObject = CustomComponent( tempClone2.myContent.getItemAt(0)); txtMsg.appendText("\nValue of tempClone2.myContent." + "getItemAt(0).message is: " + tempObject.message); }else{ txtMsg.appendText("\nValue of tempClone2.myContent." + "getItemAt(0) is not a CustomComponent."); } }else{ txtMsg.appendText("\nValue of tempClone2.myContent" + "getItemAt(0) is unaccessible."); } } //This function will copy an custom object/component //into an Object. private function cloneObject(CustomObject:*):* { var ba:ByteArray = new ByteArray(); ba.writeObject(CustomObject); ba.position = 0; return ba.readObject(); } //This function will clone an custom object/component. //based on the given type of the original object. private function cloneCustomObject(CustomObject:*):* { //Grab the Class Name of the object that we are copying var className:String = getQualifiedClassName(CustomObject); //Register it first before we clone it registerClassAlias(className, getDefinitionByName(className) as Class); //While copying the object, the Class Type will be register //because of the registerClassAlias call previously return ObjectUtil.copy(CustomObject); } ]]> </fx:Script> <s:VGroup width="100%" height="100%" verticalAlign="middle" horizontalAlign="center"> <s:Label textAlign="center" text="Output:"/> <s:TextArea width="90%" height="90%" id="txtMsg"/> </s:VGroup> </s:Application>And here's our custom component Class - CustomComponent.mxml
<?xml version="1.0" encoding="utf-8"?> <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" > <fx:Script> <![CDATA[ import mx.collections.ArrayCollection; private var _message:String = ""; public function get message():String { return _message; } public function set message(value:String):void { _message = value; } private var _myContent:ArrayCollection = new ArrayCollection(); public function get myContent():ArrayCollection { return _myContent; } public function set myContent(value:ArrayCollection):void { _myContent = value; } ]]> </fx:Script> </s:Group>* Click here for the demo shown in this post.
^ Click here for the source files for the demo.
No comments:
Post a Comment