novembro 30th, 2007A mágica do [ Bindable ]
Desde de que começei a utilizar Flex, venho usando uma palavrinha que até então me parecia que como um passe de mágica ela podia “avisar” que houve uma modificação nos objeto por ela “enfeitiçada”. Eis que navegando pelas listas sobre Flex encontrei uma explicação que até agora não vi melhor. Ela foi dada pelo Beck Novaes e segue abaixo para que todos possam compartilhar dessa que creio ser uma informação muito esclarecedora.
Vamos lá…
##########################################################
# Ministério da Saúde Adverte: Este post será bem maior do que o #
# convencional e esta explicação sobre o funcionamento viciante #
# do Data Binding pode fazer o seu cérebro entrar em loop. #
#########################################################
O [Bindable] é uma Metadata Tag o que significa dizer que é uma
instrução para o compilador fazer alguma coisa. Neste caso você está
falando para o compilador gerar o código necessário para sua
propriedade ser a fonte do DataBinding.
O segredo do funcionamento do DataBinding está na classe
“mx.binding.utils.ChangeWatcher”. Esta classe se baseia em listeners
para fazer a “mágica” do DataBinding.
Tomemos o seguinte trecho de código abaixo para facilitar a
explicação:
[xml] Neste exemplo, toda vez que o usuário digitar algo no TextInput Isto é possível porque a propriedade “text” é Bindable. Como tal, toda Em outras palavras, a mágica do DataBinding é um código que é gerado Eu fiz um teste no Flex usando a opção keep-generated- Test.mxml [xml] [Bindable(event="propertyChange")] private function set myProp(value:String):void dispatchEvent(mx.events.PropertyChangeEvent.createUpdateEvent(this, Primeiramente apenas definimos a propriedade como Bindable. Agora Test.mxml [xml] Test-generated.as [as]private function _Test_bindingsSetup():void myTextInput.text = _sourceFunctionReturnValue; Bom pessoal espero que essa explicação dada pelo nosso amigo Beck Novaes possa ser tão esclarecedora pra voces o quanto foi pra mim… Abraços…
“tiSource” isto será automaticamente copiado para o TextInput
“tiDestination”.
vez que esta propriedade mudar ela distribuirá um evento – que neste
caso é chamado de “textChanged”. Graças ao ChangeWatcher, que é usado
implicitamente toda vez que usamos as chaves {} para determinar o
Binding, será criado automaticamente um EventHandler para tratar este
evento “textChanged”. A implementação deste EventHandler pegará o
valor do “text” de “tiSource” e copiará para o “text” de
“tiDestination”.
automaticamente pelo compilador do Flex que se baseia na arquitetura
Listener – Handler que já conhecemos: alguém distribui um evento e
alguém ouve para fazer alguma coisa. Neste caso uma propriedade muda,
e um código gerado automaticamente através de uma sintaxe predefinida
(chaves{}) copia o valor desta propriedade para outra.
actionscript=true com uma propriedade Bindable e o resultado segue
abaixo.
========
width=”100%” height=”100%”>
[Bindable]
private var myProp:String;
]]>
[/xml]
_Test-binding-generated.as (Código gerado pelo compilador Flex)
======================================================
[as]class BindableProperty
{
private function get myProp():String
{
return this._1060147409myProp;
}
{
var oldValue:Object = this._1060147409myProp;
if (oldValue !== value)
{
this._1060147409myProp = value;
“myProp”, oldValue, value));
}
}
}
[/as]
Ou seja, o usar o [Bindable] o compilador Flex gerou o arquivo “_Test-
binding-generated.as” cujo conteúdo pode ser visto acima. Observe que
no “set” da propriedade um evento é disparado. No MXML acima se a
propriedade “myProp ” não fosse Bindable este código não seria gerado.
Mas isso é só uma parte do funcionamento do Bindable. Ainda é preciso
definir o que irá acontecer toda vez que o “myProp” mudar.
vamos usá-la.
========
[Bindable]
private var myProp:String;
]]>
[/xml]
Agora, outro trecho de código gerado pelo Flex, desta vez no arquivo
“Test-generated.as” é o seguinte:
===============
{
…
binding = new mx.binding.Binding(this,
function():String
{
var result:* = (myProp);
var stringResult:String = (result == undefined ?
null : String(result));
return stringResult;
},
function(_sourceFunctionReturnValue:String):void
{
},
“myTextInput.text”);
…
}
[/as]
Quem quiser entender o que faz cada linha do trecho de código acima
pode olhar no código fonte da classe mx.binding. Binding. Mas em
resumo, é este trecho de código que pega o valor de “myProp” toda vez
que ele mudar e copia para “myTextInput.text”.



dezembro 1st, 2007 at 6:57
Bacana demais! Apesar de ser um texto técnico, explicou de forma clara e com exemplos!
Depois que eu aprendi a usar o [Bindable] minha vida foi muito facilitada!
Grande abraço do Ved
dezembro 3rd, 2007 at 7:20
Antes de tudo obrigado por reproduzir o meu post. Eu gostaria apenas de pedir para que você removesse o meu email do post. Você pode até colocar um link para ele (ou para o meu blog ou blog da DClick) mas deixar ele exposto assim pode levar a um aumento considerável no número de spams na minha caixa de entrada. Tem uns robozinhos aí na net que ficam só procurando emails expostos dessa maneira, entende? Muito Obrigado!
dezembro 3rd, 2007 at 7:44
Atualizado …
dezembro 3rd, 2007 at 9:46
Tks!
outubro 10th, 2008 at 11:55
Excelente explicação! muito esclarecedora!
Parabéns a você e ao Novaes.
outubro 16th, 2008 at 21:31
Maninho, muito útil essa sua explicação, mas eu cheguei a até este post por causa de um probleminha q/ estou tendo:
no ActionScript eu tenho um array:
arrLabel["teste"]=”cod.”;
e no mxml:
ou:
acontece que quando compilo o mxml não tá vindo o valor do array, detalhe: eu estou usando o [Bindable], alguém pode me ajudar?
Desde já agradeço!
outubro 16th, 2008 at 21:31
Maninho, muito útil essa sua explicação, mas eu cheguei a até este post por causa de um probleminha q/ estou tendo:
no ActionScript eu tenho um array:
arrLabel["teste"]=”cod.”;
e no mxml:
<>
ou:
<>
acontece que quando compilo o mxml não tá vindo o valor do array, detalhe: eu estou usando o [Bindable], alguém pode me ajudar?
Desde já agradeço!
outubro 16th, 2008 at 21:32
Maninho, muito útil essa sua explicação, mas eu cheguei a até este post por causa de um probleminha q/ estou tendo:
no ActionScript eu tenho um array:
arrLabel["teste"]=”cod.”;
e no mxml:
mx:Label x=”10″ y=”40″ text=”{arrLabel['teste']}”
ou:
mx:Label x=”10″ y=”40″ text=”{arrLabel.getItemAt(‘teste’)}”
acontece que quando compilo o mxml não tá vindo o valor do array, detalhe: eu estou usando o [Bindable], alguém pode me ajudar?
Desde já agradeço!
abril 13th, 2009 at 22:14
como faria um com date field e data grid usando ActionScript e Mysql.
maio 25th, 2010 at 17:08
[...] O mais interessante seria usar BindingUtils.bindSetter chamando um funcao que não precisa ser necessariamente um setter (function set) mas uma função qualquer. Toda vez que a variável observada (watch) sofrer alguma alteração, a função do bindSetter será executada. Toda essa “magia” funciona graças ao PropertyChangeEvent (http://livedocs.adobe.com/flex/3/langref/mx/events/PropertyChangeEvent.html) que é disparado quando uma alteração em um objeto é feito. É o elemento básico para o funcionamento da metada [Bindable] Recomenda a leitura de: http://www.flexdev.com.br/home/a-magica-do-bindable/ [...]