9 de octubre de 2009

Adobe Poster: ActionScript y Flex Framework

Muchos de ustedes en el grupo de usuarios de facebook han solicitado el Poster de Adobe, bueno, aquí está. Contiene todas las clases de AS3 y Flex.

Many of you have requested on facebook user group the Adobe Poster, well here is it. Contains all AS3 classes and Flex ones.


2 de octubre de 2009

Cómo detectar cambio en un objeto personalizado

hey.. Bueno les cuento, ésta vez me enfrente a cómo detectar cambios en un objeto personalizado, para este ejemplo se llamará Checkpoint y su instancia checkpointInfo, quería detectar cuando se cambiaban los valores de las propiedades de mi objeto, para qué? para cambiar el estado del componente. Pensarán que con [Bindable] funciona, pero no es así en mi caso. El objeto Checkpoint es así:


package
{
[Bindable]
public class Checkpoint
{
public var id :int;
public var evaluated :Boolean;
public var approved :Boolean;
public var title :String;
public var level :String;
public var recommendedPercentage :int;
public var currentPercentage :int;

public function Checkpoint()
{
}
}
}


Entonces, ¿cómo hacer que cuando se cargue la aplicación pasemos de un checkpointInfo con los inicializado en null a los nuevos valores asignados más adelante en nuestro código?. Bueno, con un ObjectProxy.. el ObjectProxy según se define como:

"This class provides the ability to track changes to an item managed by this proxy. Any number of objects can "listen" for changes on this object, by using the addEventListener() method. "


  1. Iniciamos el objeto

  2. Creamos un proxy y le pasamos como parametre nuestro objeto

  3. Ahh por supuesto agregar el EventListener


public var checkpointInfo:Checkpoint;

private function init():void{
checkpointInfo = new Checkpoint();
proxy = new ObjectProxy(checkpointInfo);
proxy.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE,setCheckpointState);
}


setCheckpointInfo(cpi:Checkpoint) es llamada desde fuera del componente, para que asigne los nuevos valores a nuestra variable checkpoint, pero que pasa?.. hay que hacerlo a través del ObjectoProxy, por que si hacemos la asignación checkpointInfo.id = 1500; directamente, el evento PROPERTY_CHANGE no se va a disparar, así que se debe hacer la asignación de la siguiente manera:

public function setCheckpointInfo(cpi:Checkpoint):void{
proxy.id = cpi.id;
proxy.evaluated = cpi.evaluated;
proxy.approved = cpi.approved;
proxy.title = cpi.title;
proxy.level = cpi.level;
proxy.recommendedPercentage = cpi.recommendedPercentage;
proxy.currentPercentage = cpi.currentPercentage;
}


y aquí la función que escucha el cambio en las propiedades de la instancia de nuestro objeto personalizado.


public function setCheckpointState(event:PropertyChangeEvent=null):void{

var cpState:String;

if(checkpointInfo.evaluated){
checkpointInfo.approved ? cpState= APPROVED_STATE : cpState = FAILED_STATE;
}else

cpState = DEFAULT_STATE;

this.setCurrentState(cpState);
}


Eso es todo, saludos.. creanme que había visto ese ObjectProxy pero no sabía que hacía :) Saludos a mis amigos invisibles