######################################################
# 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:
<mx:TextInput id="tiSource"/>
<mx:TextInput id="tiDestination" text="{tiSource.text}"/>

Neste exemplo, toda vez que o usuário digitar algo no TextInput
"tiSource" isto será automaticamente copiado para o TextInput
"tiDestination".

Isto é possível porque a propriedade "text" é Bindable. Como tal, toda
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".

Em outras palavras, a mágica do DataBinding é um código que é gerado
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.

Eu fiz um teste no Flex usando a opção keep-generated-
actionscript=true  com uma propriedade Bindable e o resultado segue
abaixo.

Test.mxml
========

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
    width="100%" height="100%">
        <mx:Script>
                <![CDATA[
                        [Bindable]
                        private var myProp:String;
                ]]>
        </mx:Script>
</mx:Application>


_Test-binding-generated.as (Código gerado pelo compilador Flex)
======================================================
class BindableProperty
{

    [Bindable(event="propertyChange")]
    private function get myProp():String
    {
        return this._1060147409myProp;
    }

    private function set myProp(value:String):void
    {
        var oldValue:Object = this._1060147409myProp;
        if (oldValue !== value)
        {
                        this._1060147409myProp = value;

dispatchEvent(mx.events.PropertyChangeEvent.createUpdateEvent(this,
"myProp", oldValue, value));
        }
    }
}

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.

Primeiramente apenas definimos a propriedade como Bindable. Agora
vamos usá-la.

Test.mxml
========

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
    width="100%" height="100%">
        <mx:Script>
                <![CDATA[
                        [Bindable]
                        private var myProp:String;
                ]]>
        </mx:Script>
        <mx:TextInput id="myTextInput" text="{myProp}"/> <!-- USANDO O
BINDING -->
</mx:Application>

Agora, outro trecho de código gerado pelo Flex, desta vez no arquivo
"Test-generated.as" é o seguinte:

Test-generated.as
===============

private function _Test_bindingsSetup():void
{
...
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 = _sourceFunctionReturnValue;
            },
            "myTextInput.text");
...
}

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".

Por fim, eu gostaria de sintetizar o que o Daniel e o Erko.

Erko (Tese):
"então a dica é: use [bindable] para o que for realmente necessário "

Daniel (Antítese):
"Use bindable para tudo. Acredito ser muito dificil ele prejudicar a
performance de forma a ser perceptíviel"

Beck (Síntese):
Você pode sim usar o Bindable despreocupadamente do ponto de vista da
performance, mas em alguns casos o Bindable reduz a legibilidade do
seu código, o que dificulta na manutenção. Além disso por usar Event
Listeners, o Bindable cria dependências entre os objetos o que impede
que eles sejam excluídos da memória pelo Garbage Collection.

Será que alguém entedeu alguma coisa? Será que alguém leu tudo
isso? :-)

[]'s
Beck Novaes


On 23 nov, 14:20, Daniel Schmitz <[EMAIL PROTECTED]> wrote:
> "então a dica é: use [bindable] para o que for realmente necessário "
>
> Use bindable para tudo. Acredito ser muito dificil ele prejudicar a
> performance de forma a ser perceptíviel
>
> Outra coisa, o bindable ajuda a manter o seu código mais limpo e com
> mens bugs. Só isso já compensa o 100 milisegundos perdidos por causa
> do bindable.
>
> Agora, não culpe o bindable lento se seu grid tem 10.000 registros :)
> Ae ninguem aguenta :)
>
> Abraços,
>  Daniel Schmitz
>
> On 23 nov, 11:45, "Erko Bridee de Almeida Cabrera"
>
> <[EMAIL PROTECTED]> wrote:
> > Marcelo quanto a sua pergunta:
>
> > campos bindable tendem a diminuir a performace do sistema???
>
> > do ponto de vista gasto computacional (aumento do consumo de processamento)
> > a resposta seria SIM, mas isso depende muito de como vc vai usar
>
> > este recurso é amplamente utilizado em aplicações flex
>
> > é como se você tivesse um método set para este atributo que nele
> > vc alem de atualizar o valor do atributo, sai percorrendo toda tua aplicação
> > vendo onde que este está relacionado a campos e outros compontes
> > atualizando os mesmo
>
> > então a dica é: use [bindable] para o que for realmente necessário
>
> > []´s
>
> > Em 23/11/07, Thiago Rodrigues Fernandes <[EMAIL PROTECTED]> escreveu:
>
> > > Eu nunca senti diferença usando bindable ou não...
>
> > > Não sei no caso de muitos registros.
>
> > > --
> > > Att,
> > > Thiago R. Fernandes
>
> > > On Nov 23, 2007 11:16 AM, Marcelo Moacir Florindo <
> > > [EMAIL PROTECTED]> wrote:
>
> > > > campos bindable tendem a diminuir a performace do sistema???
>
> > > > Marcelo
>
> > > > Em 23/11/07, Erko Bridee de Almeida Cabrera < [EMAIL PROTECTED]>
> > > > escreveu:
>
> > > > > Ele indica para oq tu define como bindable que seja observado...
>
> > > > > por exemplo vc tem um atributo e marca ele como observado [bindable]
>
> > > > > e este vc relaciona a um campo....
>
> > > > > quando você mudar o valor desse campo ele irá automaticamente
> > > > > atualizar
> > > > > o campo que está relacionado com este atributo...
>
> > > > > caso tu não utilize o bindable, a atualização do campo não ocorreria
> > > > > quando você alterar o valor do atributo...
>
> > > > > []´s
> > > > > --
> > > > > Att,
> > > > > Erko Bridee de Almeida Cabrera
> > > > >http://erkobridee.com/
> > > > >http://www.portaljava.com
>
> > > > --
> > > > Marcelo Moacir Florindo
> > > > Analista/Desenvolvedor
> > > >http://www.gestaotec.com.br
>
> > --
> > Att,
> > Erko Bridee de Almeida 
> > Cabrerahttp://erkobridee.com/http://www.portaljava.com
--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
Para sair da lista, envie um email em branco para [EMAIL PROTECTED]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---

Responder a