Não é interessante que dentro de um componente vc tenha referências
"hard-coded" à outros componentes. Isso faz com que seu componente perca a
capacidade de reutilização, etc.

No seu lugar, ou eu criaria eventos personalizados, que transportariam
valores em sua ocorrência, ou então, em casos mais simples criaria
"bindings" para fazer com que um componente tivesse acesso à dados de um
outro componente. De repente, até as duas soluções juntas formam o conjunto
de soluções ideais para o seu caso.

Vou tentar colocar aqui um mini tutorial de uma das maneiras de vc resolver
isso...

Dentro do seu componente "tlEntrada", vc poderia disparar um evento que
notificasse o clique do botão editar. Para fazer isso de uma forma bem
simples:

1 - No código do clique do botão, adicione (ou altere para):
dispatchEvent(new Event("edit"));

2 - Adicione ao componente "tlEntrada" a Metatag que inclusive adicionará o
evento ao code-hinting do Flex Builder em relação a esse componente:
<mx:Metadata>
   [Event(name="editar",type="flash.events.Event")]
</mx:Metadata>

3 - Agora, na ocorrência do evento, você pode fora do componente,
especificar o que vc quer que aconteça quando o mesmo for disparado:

<local:tlEntrada edit="tabP.selectedIndex = 1"/>

ou

<local:tlEntrada edit="tlEntradaEditHandler()"/>
e na seção <mx:Script>:
private function tlEntradaEditHandler():void
{
   tabP.selectedIndex = 1;
}

Pronto! O componente "tlEntrada" não precisa mais fazer nenhuma referência
direta a nenhum outro componente, mantendo então seu funcionamento
totalmente independente, ganhando assim capacidade de reutilização.

Uma questão resolvida, mas falta o mais importante... fazer com que o
componente "tlModulos" saiba qual foi o "selectedIndex" do DG em
"tlEntrada".

Como eu disse, tem várias formas de se fazer isso. Uma delas, é a seguinte:

1 - No componente "tlModulos" vamos criar uma variável "bindable" que vai
receber o valor do "selectedIndex" do DG do componente "tlEntrada". Vamos
definir essa variável através de um Setter para que possamos acionar algum
código quando o valor atribuido para a mesma mudar. Para isso, dentro do
componente "tlModulo", na seção <mx:Script> adicione:

private var itemToEditIndex:int;
[Bindable]
public function set itemToEditIndex(value:int):void
{
   _itemToEditIndex = value;
   //talvez vc sinta a necessidade de chamar uma funcao aqui para
   //apresentar na interface os dados relacionados ao novo
   //indice. algo como mostrarDadosDoRegistroNosCampos()...
}
public function get itemToEditIndex():int
{
   return _itemToEditIndex;
}

2 - Fazer uma mudança na etapa 3 anterior para mudar o valor da nova
propriedade "itemToEditIndex" que criamos para o componente "tlModulos",
para que o mesmo contenha o valor do indice selecionado no DG dentro do
componente "tlEntrada":

<local:tlEntrada id="tlEntrada" edit="tabP.selectedIndex = 1;
tlModulos.itemToEditIndex = tlEntrada.dg.selectedIndex"/>

ou

<local:tlEntrada edit="tlEntradaEditHandler()"/>
e na seção <mx:Script>:
private function tlEntradaEditHandler():void
{
   tabP.selectedIndex = 1;
   tlModulos.itemToEditIndex = tlEntrada.dg.selectedIndex;
}

3 - Repare que esse codigo acima faz referência aos componentes através de
seus respectivos IDs, que no caso eu defini usando seus proprios nomes. ou
seja:

<local:tlEntrada id="tlEntrada"/>

<local:tlModulos id="tlModulos"/>


Eu mesmo não considero essa solução acima como a ideal. Eu a faria criando
um evento personalizado para o componente "tlEntrada" e trabalharia com o
tráfego de dados dentro do evento, criando uma classe "DTO" para representar
o dado selecionado/editado. Mas a solução para descrever aqui ficaria um
pouco mais complexa.

Mas essa forma que descrevi é uma forma que encontrei de mostrar mais
didaticamente como usar o benefício dos:

- Eventos disparados por componentes personalizados
- Binding
- getters / setters

Boa sorte!


Vicente Maciel Junior
========================================
RiaBrazil - Senior Rich App Developer
Independent Web Developer & Consultant
Adobe Certified Expert on ColdFusion and Flex with AIR
---------------------------------------------------------------------------------
+55 71 8120-0035 MSN: macie...@gmail.com / Twitter: macieljr
---------------------------------------------------------------------------------
http://www.riabrazil.com.br - http://teclandoalto.blogspot.com
Grupo de usuarios Oficial Adobe RIA-BA: http://bit.ly/ria-ba
Google Profile: http://www.google.com/profiles/macieljr
========================================


2009/11/7 Airton Toyansk <atoya...@gmail.com>

> Pessoal,
>
> Tenho a seguinte estrutura: um arquivo com um Accordion, que, para cada aba
> dele, existe um componente.
>
> <mx:Accordion
> id="tabP">
>
> <local:tlEntrada/>
>
> <local:tlModulos/>
>
> </mx:Accordion>
> No primeiro componente (tlEntrada) tenho um datagrid id="dg" com alguns
> registros, e um botão de editar, que, ao ser clicado, leva o usuário à
> segunda aba: parentDocument.tabP.selectedIndex = 1;
>
> No segundo componente (tlModulos), tenho um TextInput que quero que exiba o
> id do registro no datagrid que o usuário clicou para editar.
> Como posso recuperar esta variável no arquivo tlModulos?
>
> Seria algo como <mx:TextInput id="editando" text="{
> tlEntrada.dg.selectedItem.id}"/>, mas isso não funciona...
>
> Agradeço as respostas!
>
> Airton Toyansk
>
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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 
flexdev-unsubscr...@googlegroups.com
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---

Responder a