2009-07-06 5 views
1

Ich versuche, eine Flex-Komponente zur Laufzeit zu duplizieren.Clone Flex-Komponente

Zum Beispiel, wenn ich dieses

mx haben: label-Knopf = "BTN" id = "BTN" click = "handle (event)" />

i sollte eine Funktion namens nennen können, DuplicateComponent() und es sollte mir eine UI-Komponente zurückgeben, die genauso wie die obige Schaltfläche einschließlich der Ereignislistener damit ist.

Kann mir jemand bitte helfen ?? Vielen Dank im Voraus

Antwort

5

Erstellen Sie eine Byte-Array-Kopie. Dieser Code-Segment sollte es für Sie tun:

// ActionScript file 
import flash.utils.ByteArray; 

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

Ein Hinweis, ich habe diesen Code selbst nicht schreiben, ich bin ziemlich sicher, dass ich es von einem Beitrag auf der Flex Coder Liste bekam.

+0

Dies wird die Pixel des gerenderten Objekts kopieren. Dadurch werden Flex-Objekte nicht dupliziert, so dass sie dupliziert werden können, Funktionalität und alle. – Glenn

+1

Ich habe dies auf ArrayCollections verwendet, führen Sie dieses Snippet im Debug-Modus und vergleichen Sie sich selbst: JeffryHouser

0

Sie können eine tiefe Kopie von UIComponents nicht nativ erstellen. Am besten wäre es, einen neuen zu erstellen und den zu analysieren, dem du ein dupliziertes Setup hinzufügen musst. Um ehrlich zu sein, klingt das nach einem bisschen Code-Geruch. Ich frage mich, ob es kann mit einem wenig Umdenken eine bessere Lösung für das Problem sein ..

+0

Thanx James für die Hilfe, aber was ich versuche zu erreichen ist, dass ich eine Leinwand, die als Layout-Design handelt, die einige editierbare Textfelder hat, Bilder, Dynamische Formen, die dort gezeichnet werden, also muss ich nach Abschluss des Designprozesses das gesamte Layout in einem separaten Popup-Fenster betrachten. Daher muss ich das gesamte Layout-Canvas einschließlich seines Childs in ein neues Canvas im Pop-Fenster kopieren oder kopieren. So wie ich das erreichen kann. Gibt es einen Weg, das Gleiche zu tun? Danke im Voraus –

+0

Ich verstehe dich. Wenn ich unter der Annahme, dass diese Vorschau in keiner Weise interaktiv ist, eine Vorschau erstellen würde, wäre es viel besser, ein BitmapData-Objekt zu erstellen, das ein gezeichnetes Bild Ihrer Komponente enthält. Es wird Meilen effizienter und ein viel sauberer Ansatz. –

+0

Danke James ... das ist genau das, was ich wollte !!! Ich habe die Objektkopie über die von Ihnen empfohlene BitmapData-Methode erstellt: \t var bd: BitmapData = neue BitmapData (layout_cnv.width, layout_cnv.height); bd.draw (layout_cnv); var ba: ByteArray; ba = (neuer PNGEncoder()). Encode (bd); // Diese folgende Methode sollte bei der Initialisierung des Popup-Fensters aufgerufen werden. Img_new.load (parentApplication.ba), wobei Img_new die Bilddatei im Popup-Fenster ist. Danke noch einmal. –

0

gleiche Frage wie: http://www.flexforum.org/viewtopic.php?f=4&t=1421

für die gleiche Sache in einer Google-Suche angezeigt werden. Also hast du & geschnitten die gleiche Frage einen Monat später eingefügt. Kein Glück, eh?

Es gibt keinen einfachen Weg, dies zu tun, von dem ich weiß. Viele Einstellungen einer Komponente hängen vom container/context/etc ... ab und werden während des Erstellungsprozesses instanziiert. Es gibt also keinen Grund, aus dieser Perspektive zu klonen.

Sie können Schlüsseleinstellungen in ActionScript klonen und diese beim Erstellen neuer Elemente verwenden.

Zum Beispiel, vorausgesetzt, Sie sind nur über Eigenschaften kümmern, könnten Sie ein Array haben [ „Stylename“, „Breite“, „Höhe“, ...], und Sie können vielleicht das Array wie folgt verwendet werden:

var newUI:UIComponent = new UIComponent(); 
for each(var s:String in propArray) { 
    newUI[s] = clonedUI[s]; 
} 

Wenn Sie weitere Fragen zu Ihrer Frage haben möchten (anstatt einen Monat zu warten), teilen Sie uns mit, was Sie erreichen möchten.

+0

ja Glenn dat true, dass ich die gleiche Frage gestellt habe, da die Anforderung ähnlich ist. Was ich versuche zu erreichen ist, dass ich eine Leinwand habe, die als ein Layout - Design mit einigen editierbaren Textareas, Bildern, dynamischen Formen, die dort drüben gezeichnet wird, muss ich das gesamte Layout in Vorschau sehen ein separates Popup-Fenster. Also dafür muss ich das gesamte Layout-Canvas einschließlich seines Kinds in ein neues Canvas im Pop-Fenster kopieren oder kopieren. Also wie kann ich das erreichen. Gibt es einen Weg, um das Gleiche zu tun. Vielen Dank im Voraus. –

+0

Sie müssen im Grunde eine erweiterte Form von dem, was ich vorgeschlagen habe.Sie müssen alle Layoutelementtypen, Positionen und relevanten Eigenschaften/Stile verfolgen und sie alle replizieren, wenn Sie sie in das Popup einfügen. Die einzige andere Sache, die mir dabei einfällt, könnte in diesem Fall "describeType" sein (http://www.scottgmorgan.com/blog/index.php/2007/10/22/say-hello-to-my- Little-friend-Beschreibungstyp /). Aber ich denke, Sie werden immer noch mit einer Art Parsing oder Property Matching enden. – Glenn

1

Um dieses Problem zu lösen, sollten Sie ActionScript verwenden und die Schaltflächen dynamisch erstellen.

Können sagen, Sie wollen, dass die Taste (n) in einem VBox gehen genannten ‚someVbox‘

for (var i:uint = 0; i< 10; i++){ 
    var but:Button = new Button(); 
    but.label = 'some_id_'+i; 
    but.id = 'some_id_'+i; 
    but.addEventListener(MouseEvent.CLICK, 'handleClick'); 
    someVbox.addChild(but); 
} 

Ich habe es nicht getestet, aber die 10 Tasten auf ein vbox mit etwas Glück soll hinzufügen .

+0

Danke die Hilfe, aber was ich versuche zu erreichen ist, dass ich eine Leinwand habe, die als ein Layout-Design, das einige bearbeitbare Textareas, Bilder, dynamische Formen hat, die dort drüben gezeichnet wird, also nach Abschluss des Designprozesses muss ich Vorschau des gesamten Layouts in einem separaten Popup-Fenster. Daher muss ich das gesamte Layout-Canvas einschließlich seines Childs in ein neues Canvas im Pop-Fenster kopieren oder kopieren. So wie ich das erreichen kann. Gibt es einen Weg, das Gleiche zu tun? Vielen Dank im Voraus –

0

mx.utils.ObjectUtil ist oft nützlich, aber für komplexe Objekttypen ist es in der Regel eine gute Methode, eine Schnittstelle zu implementieren, die eine .clone() -Methode benötigt, ähnlich wie geklonte Ereignisse.

Zum Beispiel:

class MyClass implements ICanvasObject 
{ 
    ... 

    public function clone():ICanvasObject 
    { 
     var obj:MyClass = new MyClass(parameters...); 
     return obj; 
    } 
} 

Dieser Code mehr Klarheit gibt und richtig kapselt Bedenken im Zusammenhang mit dem, wie das Objekt verwendet wird/geklont.

0

Sie haben Recht, aber nach meinem Verständnis UI Komponenten werden nicht von mx.utils.ObjectUtil geklont.

aus: http://livedocs.adobe.com/flex/201/langref/mx/utils/ObjectUtil.html#copy()

copy() Methode

public static Funktion Kopie (value: Object): Object Kopiert das angegebene Objekt und gibt einen Hinweis auf die Kopie. Die Kopie wird mithilfe einer nativen Serialisierungstechnik erstellt. Dies bedeutet, dass die benutzerdefinierte Serialisierung während der Kopie berücksichtigt wird.

Diese Methode dient zum Kopieren von Datenobjekten, z. B. Elementen einer Sammlung. Es ist nicht zum Kopieren eines UIComponent-Objekts, z. B. eines TextInput-Steuerelements, vorgesehen. Wenn Sie Kopien bestimmter UIComponent-Objekte erstellen möchten, können Sie eine Unterklasse der Komponente erstellen und eine clone() - Methode oder eine andere Methode implementieren, um die Kopie auszuführen.

Parameter Wert: Objekt - Objekt, das kopiert werden soll. Objekt

Returns - Kopie des angegebenen Objekt