Pergunta

Em certos casos, eu não posso parecer para obter componentes para receber eventos.

[editar]

Para esclarecer, o código de exemplo é apenas para demonstração bem, o que eu estava realmente perguntando era se havia um local central que um ouvinte pode ser adicionado, a que se pode despachar confiável eventos de e para objetos arbitrários.

Acabei usando parentApplication para expedição e receber o evento que eu precisava para alça.

[/ edit]

Se dois componentes têm pais diferentes, ou como no exemplo abaixo, é um pop-up, ao que parece o evento nunca atinge o ouvinte (Veja o método de "Pop-up" para o despacho que não funciona):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
        layout="absolute" 
        initialize="init()">
<mx:Script>
    <![CDATA[
        import mx.controls.Menu;
        import mx.managers.PopUpManager;

        // Add listeners
        public function init():void
        {
            this.addEventListener("child", handleChild);
            this.addEventListener("stepchild", handleStepchild);
        }

        // Handle the no pop button event
        public function noPop(event:Event):void
        {
            dispatchEvent(new Event("child"));
        }

        // Handle the pop up
        public function popUp(event:Event):void
        {
            var menu:Menu = new Menu();
            var btnMenu:Button = new Button();
            btnMenu.label = "stepchild";
            menu.addChild(btnMenu);
            PopUpManager.addPopUp(menu, this);

            // neither of these work...
            this.callLater(btnMenu.dispatchEvent, [new Event("stepchild", true)]);
            btnMenu.dispatchEvent(new Event("stepchild", true));
        }

        // Event handlers

        public function handleChild(event:Event):void 
        {
            trace("I handled child");
        }

        public function handleStepchild(event:Event):void {
            trace("I handled stepchild");
        }
    ]]>
</mx:Script>

<mx:VBox>
    <mx:Button label="NoPop" id="btnNoPop" click="noPop(event)"/>
    <mx:Button label="PopUp" id="btnPop" click="popUp(event)"/>
</mx:VBox>
</mx:Application>

Não consigo pensar em soluções alternativas, mas parece que deveria haver algum ônibus evento central ...

Estou faltando alguma coisa?

Foi útil?

Solução

Acima está correto. Você está despachando o evento a partir btnMenu, mas você não está ouvindo eventos no btnMenu -. Você está ouvindo eventos no aplicativo

De qualquer expedição de aplicação:

dispatchEvent(new Event("stepchild", true));

ou ouvir no btnMenu

btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));

Outras dicas

Você está anexando o ouvinte a this quando o evento está sendo despachado de btnMenu.

Isso deve funcionar:

dispatchEvent(new Event("stepchild", true));

ps. Não há realmente nenhuma razão para colocar um 'this' desnecessária em todos os lugares, a menos que seja explicitamente necessário para superar as questões de escopo. Neste caso, você pode simplesmente deixar todos fora this.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top