Event Propagation Killer

5 views
Skip to first unread message

Miguel Vaz

unread,
Feb 13, 2012, 6:27:33 PM2/13/12
to ri...@googlegroups.com

Boa noite,

Estou a ter alguma dificuldade em parar um evento que teima em se propagar para tudo que é lado.

Tenho uma classe que faz uma travessia de um grafo, existindo a possibilidade de um nó desse grafo, ser um outro grafo. Esta situação pode acontecer infinitas vezes (quase) - grafos dentro de grafos. 
Para a travessia, a classe cria instâncias de si própria quando um dos nodos tem um grafo. Um género de recursividade.

O problema é que preciso de chamar um serviço em certo tipo de nodos e, quando regresso da chamada, retomo a travessia, mas se o estiver a fazer já numa segunda (ou x) instância da classe, o evento de retorno é apanhado por todas as instâncias da classe. :-P

Exemplo de código:

// método da classe run_workflow.as que chama o serviço externo
public function inits(pre:String):void{
remota = new RemoteObject();
remota.showBusyCursor = true;
remota.destination = "GenericFlexDestination";
remota.source = "mainclass";
remota.runPHP.addEventListener(ResultEvent.RESULT, runPHPHandler); // <- é este desgraçado que causa problemas
remota.addEventListener(FaultEvent.FAULT, errorHandler);
}

private function runPHPHandler(evt:ResultEvent):void{
// tralha de retorno da chamada externa
}


Algures no código, crio uma nova instância da classe assim:

var tempRunWF:run_workflow = new run_workflow();
tempRunWF.executar();

Nesta nova instância, obviamente, existe um método "inits()" com o mesmo evento (ver acima, é o desgraçado), e sempre que faz trigger, a instância pai da classe apanha também o evento.

Desculpem se a explicação é confusa. Estou a testar várias situações, mas até agora ainda nada. Já tentei stopImmediatePropagation no Handler, mas nada, o evento é apanhado em todo lado.

Alguma dica, por muito abstracta que seja?

Muito obrigado.

Miguel

Jorge Raimundo

unread,
Feb 13, 2012, 7:15:03 PM2/13/12
to ri...@googlegroups.com
Tens estes dois métodos.
stopPropagation e stopImmediatePropagation (no caso seria evt.stopImmediatePropagation() ).

Podes ver qual é a diferença de forma breve aqui:

Ou mais em detalhe aqui:

--
Recebeu esta mensagem porque está inscrito no grupo "Mailing List da Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" dos Grupos do Google.
Para publicar uma mensagem neste grupo, envie um e-mail para ri...@googlegroups.com.
Para anular a inscrição neste grupo, envie um e-mail para riapt+un...@googlegroups.com.
Para ver mais opções, visite este grupo em http://groups.google.com/group/riapt?hl=pt-PT.

Miguel Vaz

unread,
Feb 13, 2012, 8:57:11 PM2/13/12
to ri...@googlegroups.com

Sim, eu testei ambos, mas o problema persiste, ou seja, o evento é apanhado em todas as instâncias da classe.
Considerando o remoteobject, não existe forma de conter o evento de retorno do serviço na instância da classe a que pertence?
Em desespero de causa, até tentei usar "this." na definição do método de retorno (this.runphphandler), mas não resolve.

Miguel Vaz

unread,
Feb 14, 2012, 11:22:09 AM2/14/12
to ri...@googlegroups.com

Embora ninguém tenha respondido, deixo a solução que utilizei.

Embora tenha tentado utilizar o stopimmediatepropagation antes de escrever para aqui, sem resultado, alterei a estrutura de dispatch de eventos e o seu timing, e está a andar. Cada instância secundária da classe envia um evento quando termina a sua execução. Este evento é apanhado pela classe que a criou, parando aí o bubbling (stopImmediatePropagation). Aos primeiros testes parece-me funcionar tendo já testado vários subniveis de execução.

Muito obrigado, Jorge, pelas dicas. :-)


Miguel





2012/2/14 Miguel Vaz <pago...@gmail.com>
Reply all
Reply to author
Forward
0 new messages