Mensagem sobre o tópico
Qual a sacada do Bindable?
MIME-Version: 1.0
Message-ID: <a5b0e9e2-d537-4d4f-92f8-7f3fd3362c4b@s19g2000prg.googlegroups.com>
Date: Tue, 27 Nov 2007 09:11:22 -0800 (PST)
Received: by 10.100.121.12 with SMTP id t12mr30745anc.1196183482759; Tue, 27
Nov 2007 09:11:22 -0800 (PST)
In-Reply-To: <dd75785e-c19a-46a4-987b-e2cefec49da2@s8g2000prg.googlegroups.com>
X-IP: 201.6.119.78
References: <483c90cd0711230602t39aeeac6q55685cc48eccfbda@mail.gmail.com>
<7ba20cf90711230609y6e01c29ft59cc190c94aef122@mail.gmail.com>
<483c90cd0711230616s1cd06c6etc90630b71175f8bf@mail.gmail.com>
<55883d460711230618v2be97b2el2fe640ec6bb0ed42@mail.gmail.com>
<7ba20cf90711230645q534e9814sed5a58ec79291592@mail.gmail.com>
<dd75785e-c19a-46a4-987b-e2cefec49da2@s8g2000prg.googlegroups.com>
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9)
Gecko/20071025 Firefox/2.0.0.9,gzip(gfe),gzip(gfe)
Subject: Re: Qual a sacada do Bindable?
From: Beck Novaes <beck.nov...@gmail.com>
To: flexdev <flexdev@googlegroups.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
######################################################
# Minist=E9rio da Sa=FAde Adverte: Este post ser=E1 bem maior do que o
# convencional e esta explica=E7=E3o sobre o funcionamento viciante
# do Data Binding pode fazer o seu c=E9rebro entrar em loop.
######################################################
O [Bindable] =E9 uma Metadata Tag o que significa dizer que =E9 uma
instru=E7=E3o para o compilador fazer alguma coisa. Neste caso voc=EA est=E1=
falando para o compilador gerar o c=F3digo necess=E1rio para sua
propriedade ser a fonte do DataBinding.
O segredo do funcionamento do DataBinding est=E1 na classe
"mx.binding.utils.ChangeWatcher". Esta classe se baseia em listeners
para fazer a "m=E1gica" do DataBinding.
Tomemos o seguinte trecho de c=F3digo abaixo para facilitar a
explica=E7=E3o:
<mx:TextInput id=3D"tiSource"/>
<mx:TextInput id=3D"tiDestination" text=3D"{tiSource.text}"/>
Neste exemplo, toda vez que o usu=E1rio digitar algo no TextInput
"tiSource" isto ser=E1 automaticamente copiado para o TextInput
"tiDestination".
Isto =E9 poss=EDvel porque a propriedade "text" =E9 Bindable. Como tal, toda=
vez que esta propriedade mudar ela distribuir=E1 um evento - que neste
caso =E9 chamado de "textChanged". Gra=E7as ao ChangeWatcher, que =E9 usado
implicitamente toda vez que usamos as chaves {} para determinar o
Binding, ser=E1 criado automaticamente um EventHandler para tratar este
evento "textChanged". A implementa=E7=E3o deste EventHandler pegar=E1 o
valor do "text" de "tiSource" e copiar=E1 para o "text" de
"tiDestination".
Em outras palavras, a m=E1gica do DataBinding =E9 um c=F3digo que =E9 gerado=
automaticamente pelo compilador do Flex que se baseia na arquitetura
Listener - Handler que j=E1 conhecemos: algu=E9m distribui um evento e
algu=E9m ouve para fazer alguma coisa. Neste caso uma propriedade muda,
e um c=F3digo gerado automaticamente atrav=E9s de uma sintaxe predefinida
(chaves{}) copia o valor desta propriedade para outra.
Eu fiz um teste no Flex usando a op=E7=E3o keep-generated-
actionscript=3Dtrue com uma propriedade Bindable e o resultado segue
abaixo.
Test.mxml
=3D=3D=3D=3D=3D=3D=3D=3D
<?xml version=3D"1.0" encoding=3D"utf-8"?>
<mx:Application xmlns:mx=3D"http://www.adobe.com/2006/mxml"
width=3D"100%" height=3D"100%">
<mx:Script>
<![CDATA[
[Bindable]
private var myProp:String;
]]>
</mx:Script>
</mx:Application>
_Test-binding-generated.as (C=F3digo gerado pelo compilador Flex)
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
class BindableProperty
{
[Bindable(event=3D"propertyChange")]
private function get myProp():String
{
return this._1060147409myProp;
}
private function set myProp(value:String):void
{
var oldValue:Object =3D this._1060147409myProp;
if (oldValue !=3D=3D value)
{
this._1060147409myProp =3D 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=FAdo pode ser visto acima. Observe que
no "set" da propriedade um evento =E9 disparado. No MXML acima se a
propriedade "myProp " n=E3o fosse Bindable este c=F3digo n=E3o seria gerado.=
Mas isso =E9 s=F3 uma parte do funcionamento do Bindable. Ainda =E9 preciso
definir o que ir=E1 acontecer toda vez que o "myProp" mudar.
Primeiramente apenas definimos a propriedade como Bindable. Agora
vamos us=E1-la.
Test.mxml
=3D=3D=3D=3D=3D=3D=3D=3D
<?xml version=3D"1.0" encoding=3D"utf-8"?>
<mx:Application xmlns:mx=3D"http://www.adobe.com/2006/mxml"
width=3D"100%" height=3D"100%">
<mx:Script>
<![CDATA[
[Bindable]
private var myProp:String;
]]>
</mx:Script>
<mx:TextInput id=3D"myTextInput" text=3D"{myProp}"/> <!-- USANDO O
BINDING -->
</mx:Application>
Agora, outro trecho de c=F3digo gerado pelo Flex, desta vez no arquivo
"Test-generated.as" =E9 o seguinte:
Test-generated.as
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
private function _Test_bindingsSetup():void
{
=2E..
binding =3D new mx.binding.Binding(this,
function():String
{
var result:* =3D (myProp);
var stringResult:String =3D (result =3D=3D undefined ?
null : String(result));
return stringResult;
},
function(_sourceFunctionReturnValue:String):void
{
myTextInput.text =3D _sourceFunctionReturnValue;
},
"myTextInput.text");
=2E..
}
Quem quiser entender o que faz cada linha do trecho de c=F3digo acima
pode olhar no c=F3digo fonte da classe mx.binding. Binding. Mas em
resumo, =E9 este trecho de c=F3digo 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=E3o a dica =E9: use [bindable] para o que for realmente necess=E1rio "
Daniel (Ant=EDtese):
"Use bindable para tudo. Acredito ser muito dificil ele prejudicar a
performance de forma a ser percept=EDviel"
Beck (S=EDntese):
Voc=EA pode sim usar o Bindable despreocupadamente do ponto de vista da
performance, mas em alguns casos o Bindable reduz a legibilidade do
seu c=F3digo, o que dificulta na manuten=E7=E3o. Al=E9m disso por usar Event=
Listeners, o Bindable cria depend=EAncias entre os objetos o que impede
que eles sejam exclu=EDdos da mem=F3ria pelo Garbage Collection.
Ser=E1 que algu=E9m entedeu alguma coisa? Ser=E1 que algu=E9m leu tudo
isso? :-)
[]'s
Beck Novaes
On 23 nov, 14:20, Daniel Schmitz <daniel...@gmail.com> wrote:
> "ent=E3o a dica =E9: use [bindable] para o que for realmente necess=E1rio =
"
>
> Use bindable para tudo. Acredito ser muito dificil ele prejudicar a
> performance de forma a ser percept=EDviel
>
> Outra coisa, o bindable ajuda a manter o seu c=F3digo mais limpo e com
> mens bugs. S=F3 isso j=E1 compensa o 100 milisegundos perdidos por causa
> do bindable.
>
> Agora, n=E3o culpe o bindable lento se seu grid tem 10.000 registros :)
> Ae ninguem aguenta :)
>
> Abra=E7os,
> Daniel Schmitz
>
> On 23 nov, 11:45, "Erko Bridee de Almeida Cabrera"
>
> <erko.bri...@gmail.com> 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 processamen=
to)
> > a resposta seria SIM, mas isso depende muito de como vc vai usar
>
> > este recurso =E9 amplamente utilizado em aplica=E7=F5es flex
>
> > =E9 como se voc=EA tivesse um m=E9todo set para este atributo que nele
> > vc alem de atualizar o valor do atributo, sai percorrendo toda tua aplic=
a=E7=E3o
> > vendo onde que este est=E1 relacionado a campos e outros compontes
> > atualizando os mesmo
>
> > ent=E3o a dica =E9: use [bindable] para o que for realmente necess=E1rio=
>
> > []=B4s
>
> > Em 23/11/07, Thiago Rodrigues Fernandes <thifernan...@gmail.com> escreve=
u:
>
> > > Eu nunca senti diferen=E7a usando bindable ou n=E3o...
>
> > > N=E3o sei no caso de muitos registros.
>
> > > --
> > > Att,
> > > Thiago R. Fernandes
>
> > > On Nov 23, 2007 11:16 AM, Marcelo Moacir Florindo <
> > > marceloflori...@gmail.com> wrote:
>
> > > > campos bindable tendem a diminuir a performace do sistema???
>
> > > > Marcelo
>
> > > > Em 23/11/07, Erko Bridee de Almeida Cabrera < erko.bri...@gmail.com>=
> > > > escreveu:
>
> > > > > Ele indica para oq tu define como bindable que seja observado...
>
> > > > > por exemplo vc tem um atributo e marca ele como observado [bindabl=
e]
>
> > > > > e este vc relaciona a um campo....
>
> > > > > quando voc=EA mudar o valor desse campo ele ir=E1 automaticamente
> > > > > atualizar
> > > > > o campo que est=E1 relacionado com este atributo...
>
> > > > > caso tu n=E3o utilize o bindable, a atualiza=E7=E3o do campo n=E3o=
ocorreria
> > > > > quando voc=EA alterar o valor do atributo...
>
> > > > > []=B4s
> > > > > --
> > > > > 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.portaljav=