Flex/AS3 – Truques e Dicas #5 – [Bindable] & Change Watcher


Bem, toda a gente sabe que o Bindable nos salva em muitas situações, mas por vezes alem do bindable o ChangeWatcher pode ser muito util.

Uma curta explicação sobre o que é uma variavel bindable:

[Bindable]
private var nomeCliente:String="Mario";

A tag [Bindable] que faz com que o  valor da variavel nomeCliente seja monitorizada e em caso de alteração que todos os elementos na nossa aplicação que usem essa variavel sejam informados das alterações. 

Mas agora imaginem que tenho um objecto:

[Bindable]
var cliente:Object;
 
cliente=new Object;
cliente.nome="Mario";
cliente.tel="352 55 55 55";
cliente.email="admin@mail.com");
cliente.authLevel=1;
cliente.lang="PT_br";
cliente.pais="Portugal";

E quero saber quando foi alterada a lingua, e apenas a lingua… o resto não quero saber… claro que poderiamos fazer um método tradicionalmente sujo, guardando a lang do objecto numa variavel à parte, depois associando um evento change, por exemplo a um elemento que sofra a alteração quando o Bindable informar esse mesmo elemento, tal como um label:

Agora poderiamos saber quando essa alteração via bindable Ocorreu, já que ao mudar o label a função objectoMudou seria chamada e aí comparariamos o valor do cliente.lang com a variavel lang que tinhamos anteriormente, para sabermos se a lang foi alterada, mas isto tudo seria lógico se não existisse o chamado changeWatcher, que serve perfeitamente para saber quando uma propriedade de um objecto mudou. O seu uso é simples, tendo apenas uma obrigação, o objecto de ser inicializado como ObjectProxy() e nao como Object, já que sendo declarado como objecto ele não é passivel de ser observado. Vejam o exemplo seguindo o objecto cliente:

private var vigia:ChangeWatcher;
 
cliente=new ObjectProxy;
cliente.nome="Mario";
cliente.tel="352 55 55 55";
cliente.email="admin@mail.com");
cliente.authLevel=1;
cliente.lang="PT_br";
cliente.pais="Portugal";
 
vigiaChangeWatcher.watch(cliente, ["lang"], onMudaElemento);

Esta operação é quase como se adicionassemos um eventListner “Change” ao cliente.lang mas com mais vantagens, e como tal necessita do eventHandler onMudaElemento:

private function onMudaElemento(evt:PropertyChangeEvent):void {
trace("Propriedade "+evt.property+" alterada de : "+evt.oldValue+" para "+evt.newValue);
}

O evento é um PropertyChangeEvent onde nos passa muitas informaçãoes, tal como o valor anterior, e o novo valor o que elimina a necessidade de ter que verificar esses antigos e novos valores com recurso a mais variaveis…

Util não? :)

Deixe um comentário ou um Trackback
   

3 Comentários

  1. Brian
    April 4, 2009 às 7:19 pm | Permalink

    Excelente!

  2. rafa
    August 27, 2009 às 1:34 pm | Permalink

    da hora…vlwssss

  3. May 7, 2011 às 3:37 pm | Permalink

    Fantástico!!! Vlw!

Deixe um comentário

O seu email nunca será publicado ou partilhado. Campos obrigatórios estão marcados com um *

*
*

Spam Protection by WP-SpamFree