Para deixar registrado a solução que implementei com a ajuda Clayton, Cristian e Luis.
Componente: <?xml version="1.0" encoding="utf-8"?> <s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="250" height="200" title="{labelpanel}" > <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <fx:Metadata> [Event(name="editarGrupo", type="flash.events.Event")] [Event(name="insertGrupo", type="flash.events.Event")] </fx:Metadata> <fx:Script> <![CDATA[ [Bindable] public var labelBtn; [Bindable] public var labelpanel; private function getAcao():void{ if(labelBtn == "Alterar"){ dispararEventoAlterar(); }else if(labelBtn == "Inserir"){ dispararEventoIncluir(); } } private function dispararEventoAlterar():void{ dispatchEvent(new Event('editarGrupo', true)) } private function dispararEventoIncluir():void{ dispatchEvent(new Event('insertGrupo', true)) } ]]> </fx:Script> <s:Button x="89" y="118" label="{labelBtn}" id="btnGrupo" click="getAcao()" /> <s:TextInput id="descricaoGrupo" x="89" y="43" /> <s:TextInput id="idGrupo" x="10" y="10" visible="false" /> <s:Label x="37" y="49" text="Grupos"/> </s:Panel> Aplicaçao: <comp:GrupoComp id="painelCadastroGrupo" x="103" y="10" labelBtn="Inserir" insertGrupo="inserirGrupo(event)" labelpanel="Cadastro" editarGrupo="alterarGrupo(event)"/> Obrigado []'s Marcelo Em 20 de novembro de 2011 21:55, Clayton <[email protected]> escreveu: > Pra jogar mais um pouco da força do Flex pode-se aplicar junto a isso state, > já que o seu componente está em mxml. > Você poderia declarar dois states, mais ou menos assim, me desculpem se > escrever errado, é que estou fazendo este código agora e direto no gmail. > > <states> > <State name="inserir"/> > <State name="alterar"/> > </states> > > <s:Button x="89" y="118" > label.inserir="Inserir" label.alterar="Alterar" id="btnGrupo" > click.inserir="dispararEventoIncluir()" click.inserir="dispararEventoAlterar()"/> > > Desta forma não é necessário informar o label, apenas altera o state > conforme a necessidade, e também não é preciso do método getAcao para > executar um if. > Métodos como o getAcao, no meu entendimento, devem ser evitados pois somente > fazem escolhas com if e comparando strings, e nem mesmo utiliza uma > constante, isso abre a possibilidade de o desenvolvedor cometer erros. > > Bom, isso é apenas um perfeccionismo meu. > > Em 20 de novembro de 2011 17:59, Cristian Edson Göhl > <[email protected]> escreveu: > >> É uma boa mesmo, utilizo nos meus componentes, nos forms não, pois >> trabalho diferente com eles. >> >> [Event(name="name", type="flash.events.Event")] >> >> Fiz o exemplo, com seu código: >> >> Componente: >> <fx:Metadata> >> [Event(name="editarGrupo", type="flash.events.Event")] >> [Event(name="inserirGrupo", type="flash.events.Event")] >> </fx:Metadata> >> >> <fx:Script> >> <![CDATA[ >> >> [Bindable] >> public var labelBtn:String; >> >> [Bindable] >> public var labelpanel:String; >> >> protected function dispararEventoAlterar():void >> { >> dispatchEvent(new Event('editarGrupo', true)); >> } >> >> >> protected function dispararEventoIncluir():void >> { >> dispatchEvent(new Event('incluirGrupo', true)); >> >> } >> >> private function getAcao():void >> { >> if(labelBtn == "Alterar") >> { >> dispararEventoAlterar(); >> } >> else if(labelBtn == "Inserir") >> { >> dispararEventoIncluir(); >> } >> } >> >> ]]> >> </fx:Script> >> <s:Button x="89" y="118" label="{labelBtn}" id="btnGrupo" >> click="getAcao()"/> >> >> >> Aplicação: >> <comp:GrupoComp labelBtn="Inserir" labelpanel="Cadastro" >> id="painelCadastroGrupo" inserirGrupo="inserirGrupo" >> editarGrupo="alterarGrupo"/> >> >> >> -----Original Message----- From: Luis Eduardo >> Sent: Sunday, November 20, 2011 4:04 PM >> To: [email protected] >> Subject: Re: [flexdev] mudar click do botao que esta em um componente >> >> >> >> >> Eu achei pouco ortodoxo, mas muito efetivo. >> Que tal uma pequena melhoria no código, sem atrapalhar o que foi >> sugerido pelos colegas: >> >> No mxml do GrupoComp, coloque uma Metadata de Event pra deixar >> explicito quais eventos customizados esse componente dispara. >> Isso vai te permitir tirar a função de Init() do Application e >> fazer algo assim: >> >> <comp:GrupoComp labelBtn="Inserir" labelpanel="Cadastro" >> id="painelCadastroGrupo" onInsert="inserirGrupo" onEdit="editarGrupo" /> >> >> abraços, >> - Luís >> >> >> >> Em 20/11/2011 10:24, Marcelo A escreveu: >>> >>> Eu acho que fiz uma mistura do que vcs falaram e deu certo. Veja se >>> fiz corretamente. >>> Na aplicacao eu seto o label do botao(Inserir ou Alterar) do >>> componente. No componente verifico qual é o label do botao(Inserir ou >>> Alterar). Para cada situacao eu chamo uma funcao que faz um dispatch. >>> >>> Na aplicacao chamo uma funcao init que fica escutando esse dispatch. >>> Veja os codigos abaixo. Será que foi isso que vcs quiseram dizer? >>> >>> Componente: >>> <fx:Script> >>> <![CDATA[ >>> [Bindable] >>> public var labelBtn; >>> >>> [Bindable] >>> public var labelpanel; >>> >>> private function getAcao():void{ >>> if(labelBtn == "Alterar"){ >>> dispararEventoAlterar(); }else if(labelBtn == "Inserir"){ >>> dispararEventoIncluir(); >>> } >>> } >>> private function dispararEventoAlterar():void{ >>> dispatchEvent(new Event('editarGrupo', true)) >>> } >>> >>> private function dispararEventoIncluir():void{ >>> dispatchEvent(new Event('incluirGrupo', true)) >>> } >>> >>> ]]> >>> </fx:Script> >>> <s:Button x="89" y="118" label="{labelBtn}" id="btnGrupo" >>> click="getAcao()" /> >>> >>> >>> Aplicacao >>> >>> <comp:GrupoComp labelBtn="Inserir" labelpanel="Cadastro" >>> id="painelCadastroGrupo" /> >>> >>> private function init():void >>> { >>> this.addEventListener("incluirGrupo",inserirGrupo); >>> this.addEventListener("alterarGrupo",alterarGrupo); >>> } >>> >>> >>> >>> >>> >>> Em 20 de novembro de 2011 10:51, Clayton<[email protected]> >>> escreveu: >>>> >>>> A forma correta é fazer o click do botão do componente disparar um >>>> evento >>>> customizado, desta forma qualquer outro que o utilizar poderá escutar o >>>> evento e executar o método que lhe convier. >>>> >>>> Em 20 de novembro de 2011 02:10, Cristian Edson Göhl >>>> <[email protected]> escreveu: >>>> >>>>> Opa Marcelo, >>>>> >>>>> cara tu até poderia fazer algo utilizando assim: >>>>> >>>>> >>>>> protected function >>>>> bMarcelo_clickHandler(event:MouseEvent):void >>>>> { >>>>> //codigo >>>>> } >>>>> >>>>> protected function >>>>> bMarcelo_clickHandler2(event:MouseEvent):void >>>>> { >>>>> //codigo >>>>> } >>>>> >>>>> bMarcelo.removeEventListener(MouseEvent.CLICK, >>>>> bMarcelo_clickHandler); // Assim você remove um evento. >>>>> bMarcelo.addEventListener(MouseEvent.CLICK, >>>>> bMarcelo_clickHandler2); // Assim adiciona um evento. >>>>> >>>>> Nesse sentido você conseguiria fazer funcionar, porém teria que ter >>>>> cuidado de sempre remover um evento adicionado, para não ficar com mais >>>>> de >>>>> 1. >>>>> >>>>> Não aconselho fazer algo deste tipo. >>>>> >>>>> Use alguma outra verificação para saber o que fazer, talvez até pelo >>>>> text >>>>> do button, >>>>> >>>>> if (bMarcelo.label == "asd") >>>>> { >>>>> // Fazer tal coisa. >>>>> } >>>>> else >>>>> { >>>>> // tal coisa >>>>> } >>>>> >>>>> Assim só precisa uma função, que já pode deixar definida no click pelo >>>>> mxml, é mais rápido, menos código, e mais fácil de entender. >>>>> >>>>> Abraço. >>>>> -----Original Message----- From: Marcelo A >>>>> Sent: Saturday, November 19, 2011 11:51 PM >>>>> To: [email protected] >>>>> Subject: [flexdev] mudar click do botao que esta em um componente >>>>> >>>>> >>>>> Pessoal, >>>>> >>>>> tenho um componente que é um Panel e nele tenho um botao. >>>>> Na minha aplicacao chamo esse componente e altero o label do botao por >>>>> exemplo. O que eu nao sei é como faço para passar para o click do >>>>> botao a function que desejo. >>>>> Pois posso ter esse componente Panel em dois momentos diferentes da >>>>> minha aplicacao e quero que ele tenha funcionalidades diferentes no >>>>> click do botao. >>>>> >>>>> Abaixo coloco o exemplo que estou falando. >>>>> >>>>> Obrigado. >>>>> []'s >>>>> Marcelo >>>>> >>>>> Componente: >>>>> >>>>> <s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" >>>>> xmlns:s="library://ns.adobe.com/flex/spark" >>>>> xmlns:mx="library://ns.adobe.com/flex/mx" >>>>> width="250" height="200" title="{labelpanel}"> >>>>> <fx:Declarations> >>>>> <!-- Place non-visual elements (e.g., services, value objects) here --> >>>>> </fx:Declarations> >>>>> <fx:Script> >>>>> <![CDATA[ >>>>> [Bindable] >>>>> public var labelBtn; >>>>> >>>>> [Bindable] >>>>> public var labelpanel; >>>>> >>>>> ]]> >>>>> </fx:Script> >>>>> <s:Button x="89" y="118" label="{labelBtn}" id="btnGrupo" /> >>>>> <s:TextInput id="descricaoGrupo" x="89" y="43" /> >>>>> <s:Label x="37" y="49" text="Grupo"/> >>>>> </s:Panel> >>>>> >>>>> >>>>> Aplicacao >>>>> >>>>> <comp:GrupoComp labelBtn="Inserir" labelpanel="Cadastro" >>>>> id="painelCadastroGrupo" /> >>>>> >>>>> -- >>>>> Você recebeu esta mensagem porque está inscrito na lista "flexdev" >>>>> Para enviar uma mensagem, envie um e-mail para [email protected] >>>>> 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 >>>>> -- >>>>> Você recebeu esta mensagem porque está inscrito na lista "flexdev" >>>>> Para enviar uma mensagem, envie um e-mail para [email protected] >>>>> 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 >>>> >>>> >>>> >>>> >>>> -- >>>> Clayton Marques Pereira >>>> >>>> -- >>>> Você recebeu esta mensagem porque está inscrito na lista "flexdev" >>>> Para enviar uma mensagem, envie um e-mail para [email protected] >>>> 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 >> >> >> -- >> Você recebeu esta mensagem porque está inscrito na lista "flexdev" >> Para enviar uma mensagem, envie um e-mail para [email protected] >> 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 >> -- >> Você recebeu esta mensagem porque está inscrito na lista "flexdev" >> Para enviar uma mensagem, envie um e-mail para [email protected] >> 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 > > > > > -- > Clayton Marques Pereira > > -- > Você recebeu esta mensagem porque está inscrito na lista "flexdev" > Para enviar uma mensagem, envie um e-mail para [email protected] > 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 -- Você recebeu esta mensagem porque está inscrito na lista "flexdev" Para enviar uma mensagem, envie um e-mail para [email protected] 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
