Al desarrollar RIAs siempre nos vemos en la necesidad de realizar alguna acción cuando un dato cambia al ser cargado desde el servidor. Flex nos ofrece el metatag [Bindable] para refrescar los cambios que sufren los datos, pero es limitado que sólo nos refresque la información en algunos casos.
Para dejar todo claro veamos un ejemplo de un Binding clásico.
Código :
package com.otakurzo.models
{
import flash.events.TimerEvent;
import flash.utils.Timer;
import mx.collections.ArrayCollection;
[Bindable]
public class UserModel
{
public var acList:ArrayCollection = new ArrayCollection();
//-- loadData(); sumilará el tiempo de respuesta de un servidor en 1.5 segundos
private var _timer:Timer;
public function loadData():void
{
_timer = new Timer(1500,1);
_timer.addEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete,false,0,true);
_timer.start();
}
private function onTimerComplete(e:TimerEvent):void
{
// Removemos el evento, lo detenemos y destruimos el Timer
_timer.removeEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete);
_timer.stop();
_timer = null;
// --
acList.source = new Array('Otaku RzO','Eldervaz','Elecash','Zguillez','Xklibur','Fernando','eParada','Freddier');
}
//--
//-- Singleton
private static var _instance:UserModel=null;
public function UserModel(e:Enforcer){
trace('new instance of UserModel created');
}
public static function getInstance():UserModel{
if(_instance==null){
_instance=new UserModel(new Enforcer());
}
return _instance;
}
//--
}
}
class Enforcer{}Código :
UserModel.getInstance().acList
Código :
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="199" height="324">
<mx:Script>
<![CDATA[
import com.otakurzo.models.UserModel;
private function loadUsers(e:Event):void
{
btnLoadUsers.enabled = false;
btnLoadUsers.label = "Cargando...";
//Llamamos a la función que cargará los datos
UserModel.getInstance().loadData();
}
]]>
</mx:Script>
<mx:Panel width="173" height="295" layout="absolute" styleName="opaquePanel" horizontalCenter="0" verticalCenter="0" title="Ejemplo 1">
<mx:List height="212" id="lstUsers" width="133" dataProvider="{UserModel.getInstance().acList}" x="10" y="10"></mx:List>
<mx:Button id="btnLoadUsers" label="Cargar Usuarios" click="loadUsers(event);" width="133" x="10" y="228"/>
</mx:Panel>
</mx:Application>
Código :
UserModel.getInstance().acListDe esta manera los datos se actualizarán cada vez que se produzca un cambio en ellos.
Código :
ChangeWatcher.watch(obj:Object,property:String,handler:Function):ChangeWatcherTiene otros parámetros opcionales pero para el uso que le daremos con estos nos basta.
Código :
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="199" height="324">
<mx:Script>
<![CDATA[
import mx.binding.utils.ChangeWatcher;
import com.otakurzo.models.UserModel;
private var cwUsers:ChangeWatcher;
private function loadUsers(e:Event):void
{
btnLoadUsers.enabled = false;
btnLoadUsers.label = "Cargando...";
//Vaciamos la data para notar los cambios
UserModel.getInstance().acList.source = new Array();
//Empezamos a escuchar cambios en la propiedad source del
//objecto acList que esta dentro de la Clase UserModel
cwUsers = ChangeWatcher.watch(UserModel.getInstance().acList,'source',onUserChange);
//--
//llamamos a la función que cargará los datos
UserModel.getInstance().loadData();
}
private function onUserChange(e:Event):void
{
//Dejamos de escuchar cambios y liberamos la variable
cwUsers.unwatch();
cwUsers = null;
//--
btnLoadUsers.enabled = true;
btnLoadUsers.label = "Cargar Usuarios";
}
]]>
</mx:Script>
<mx:Panel width="173" height="295" layout="absolute" styleName="opaquePanel" horizontalCenter="0" verticalCenter="0" title="Ejemplo 1">
<mx:List height="212" id="lstUsers" width="133" dataProvider="{UserModel.getInstance().acList}" x="10" y="10"></mx:List>
<mx:Button id="btnLoadUsers" label="Cargar Usuarios" click="loadUsers(event);" width="133" x="10" y="228"/>
</mx:Panel>
</mx:Application>Código :
ChangeWatcher.watch(UserModel.getInstance(),'acList',onUserChange);
Código :
ChangeWatcher.watch(UserModel.getInstance().acList,'source',onUserChange);Ya que acList es un objecto y source es su propiedad.
Código :
ChangeWatcher.watch(UserModel.getInstance(),'login_status',onUserChange);
Otaku RzO :
fernando-blog :