Clonando objetos em Flex
A algum tempo atrás eu estava com um problema em flex, onde eu precisava duplicar um objeto em flex!
Eu tinha uma VBox contendo um lista de objetos em seu dataProvider. Estava utilizando o recurso de arratar e soltar!
Esse objeto arrastado devia ir pra dentro de um TileList.
O problema, quando eu clicava duas vezes dentro de um elemento da tileList, eu poderia configurar alguns parametros no objeto, mas… A tileList poreria receber N vezes o mesmo elemento, e como no flex, tudo é por referência, tudo que eu alterava num elemento da lista, na verdade estava alterando em todos os elementos, já que era o mesmo objeto!
Para resolvet o problema, usei a seguinte classe:
package gregui
{
import flash.utils.ByteArray;
public class CloneObjet
{
/**
* Clona um Objeto
* @return object
*/
public static function clonar(o:Object):Object {
var bytes:ByteArray = new ByteArray();
bytes.writeObject(o);
bytes.position = 0;
return bytes.readObject();
}
}
Exemplo:
var exemplo:Object = new Object();
var exemplo_copy = exemplo;
exemplo.nome = “Gregui”;
exemplo_copy.nome = “Shigunov”;
ao final o objeto exemplo “É” a variável exemplo_copy, ou seja, se eu pegar o valor de “exemplo.nome”, ele seria “Shigunov”, e não “Gregui”.
Agora utilizando o clone:
var exemplo:Object = new Object();
var exemplo_copy = CloneObject.clonar(exemplo);
exemplo.nome = “Gregui”;
exemplo_copy.nome = “Shigunov” ;
ao final o objeto exemplo é um objeto e exemplo_copy é outro. Note que utilizer uma classe do tipo Objet, mas poderia ser utilizado com outra classe;
Bom, não testei com objetos muito complexo, mas funcionou para oque eu precisei. Espero que ajudem vocês também!
em 11 11UTC Setembro 11UTC 2007 em 1:53 pm
Tem o ObjectUtil.copy() , mas faz basicamente o que você fez.
em 17 17UTC Novembro 17UTC 2008 em 1:21 pm
Pah, ta eu aqui procurando 1 lance de java, qdo o google me retorna a pagina.. Programação « Gregui Shigunov
fui obrigado a deixar 1 post…
abraços A-Gregui
Rodrigo (caso nao lembre, sou o cara de floripa q trabalhou com voce na voxel)