Mostrando las entradas con la etiqueta ObjectProxy. Mostrar todas las entradas
Mostrando las entradas con la etiqueta ObjectProxy. Mostrar todas las entradas

20 de noviembre de 2009

warning: unable to bind to property '' on class ''

Uno de los warning que más detesto en Flex “warning: unable to bind to property 'X' on class 'X'”. Para evitar éste warning en nuestra código, causando posibles errores en la asignación de los datos de nuestras clases, se debe tener en cuenta estas tres (3) cosas:

  1. La clase debe estar marcada como [Bindable]
  2. Todo atributo Bindable debe tener su setter y su getter respectivo.
  3. Los atributos preferiblemente deben ser private (es mi práctica) y por supuestos public los getter y setters.

Posible código propenso a Warning. Error tipo 1

package
{
public class Usuario
{
public var nombre :String;
public var apellido :String;

public function Usuario()
{
}
}
}




Razón: No está marcada como [Bindable].



Posible código propenso a Warning. Error tipo 2 + tipo 3 de una.



package
{
[Bindable]
public class Usuario
{
private var _nombre :String;
private var _apellido :String;

public function Usuario()
{
}

public function get nombre():String{
return this._nombre;
}

public function set apellido(valor:String):void{
this._apellido = valor;
}

public function get apellido():String{
return this._apellido;
}
}
}




Warning: unable to bind property ‘nombre’ on class ‘Usuario’



Razón: No tenemos el setter para nombre



Teniendo en cuenta estos detalles, el unable to bind property desaparecerá, ah y también usando cuando sea necesario el ObjectProxy.





Feliz fin de semana

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