ObjectUtil.copy

Dentro de mx.utils.ObjectUtil existe el comando copy que realmente hace eso, copiar un objeto en otro, parece algo sencillo pero realmente más sencillo parecía que para copiar un objeto se pudiera hacer mediante objeto2=objeto1, pero en Flex esto asigna el valor de objeto1 a objeto2 pero tambien lo une de forma que las modificaciones sobre objeto2 se hacen también sobre objeto1 (Two Way Data Binding).

De esta forma podemos seleccionar un objeto en un DataGrid y editar el objeto seleccionado pudiendo si lo deseamos deshacer los cambios y volver al objeto original ya que no lo estaremos modificando.

Aplicación de ejemplo:

CODE:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
  3.     <mx:Script>
  4.         <![CDATA[
  5.        
  6.                 import mx.utils.ObjectUtil;
  7.        
  8.             [Bindable]
  9.             private var empleadoActivo:Object;
  10.  
  11.             private function muestraFicha():void {
  12.                 empleadoActivo=ObjectUtil.copy(listaEmpleados.selectedItem);
  13.             }
  14.  
  15.             private function guarda():void {
  16.                 empleadosAC.setItemAt(empleadoActivo, listaEmpleados.selectedIndex);
  17.             }
  18.         ]]>
  19.     </mx:Script>
  20.        <mx:ArrayCollection id="empleadosAC">
  21.       <mx:source>
  22.          <mx:Object nombre="Nombre1" dato="dato1"/>
  23.          <mx:Object nombre="Nombre2" dato="dato2"/>
  24.          <mx:Object nombre="Nombre3" dato="dato3"/>
  25.       </mx:source>
  26.    </mx:ArrayCollection>
  27.    <mx:DataGrid dataProvider="{empleadosAC}" id="listaEmpleados"
  28. click="muestraFicha()">
  29.         <mx:columns>
  30.             <mx:DataGridColumn headerText="Nombre" dataField="nombre"/>
  31.             <mx:DataGridColumn headerText="Dato" dataField="dato"/>
  32.         </mx:columns>
  33.    </mx:DataGrid>
  34.     <mx:TextInput id="text1" text="{empleadoActivo.nombre}" change="empleadoActivo.nombre=event.target.text;"/>
  35.     <mx:TextInput id="text2" text="{empleadoActivo.dato}" change="empleadoActivo.dato=event.target.text;"/>
  36.     <mx:Button id="guardar" label="Guardar" click="guarda()" />
  37. </mx:Application>

Esta aplicación hace una copia del objeto cuando se edita, si queremos ver el cambio al hacerlo sin el ObjectUtil.copy no tenemos más que sustituir la línea:

empleadoActivo=ObjectUtil.copy(listaEmpleados.selectedItem);

por:

empleadoActivo=listaEmpleados.selectedItem;

Al hacer cambios sobre empleadoActivo esos cambios se verán reflejados en el dataGrid. El cambio no se ve al instante ya que el DataGrid no se actualiza, pero reordena el DataGrid y sorpresa!!!

Comments are closed.