Pergunta

Eu estou de alguma forma criando um estouro de pilha no Flex 3 ... Eu estou tentando obter dados a partir de uma janela de diálogo modal como tal:

aplicativo principal:

var myPopup:MyPopup;

function buttonClick( event:MouseEvent ):void
{
myPopup = MyPopup( PopUpManager.createPopUp( this, MyPopUp, true ) );
myPopup.addEventListener( CloseEvent.CLOSE, handler, false, 0, true );
}

function handler():void
{
//get data
}

MyPopup:

function buttonHandler( MouseEvent:event ):void
{
PopUpManager.remove( this );
this.dispatchEvent( new CloseEvent( CloseEvent.CLOSE ) );
}

Se esta for inadequada, o que é a maneira correta de lidar com o fechamento do popup de uma forma que me permite usar e recuperar dados sobre o objeto?

Foi útil?

Solução

Talvez você poderia tentar adicionar um parâmetro evento em seu manipulador. Eu não tenho tanta certeza que ActionScript sempre pode tolerar que não está sendo fornecido. Exemplo:

function handler(event:CloseEvent):void {
    // Handle away
}

Eu também segundo a prática de invocar o manipulador antes de demitir o popup como mencionado por Justin.

Outras dicas

Eu recriado o seu código e ele funciona muito bem para mim :( Isso significa que, quer eu tenha entendido mal o seu problema ou o erro está em outro lugar no seu código.

Qualquer chance de que você pode enviar mais alguns detalhes sobre o problema?

Sam

PS Aqui está o código que eu usei para teste com:

Application.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

    <mx:Button x="10" y="10" label="Button" click="buttonClick(event)" id="popupButton"/>

    <mx:Script>
        <![CDATA[
            import mx.core.IFlexDisplayObject;
            import mx.managers.PopUpManager;

            private var popup:Popup;

            private function buttonClick(e:MouseEvent):void {
                popup = PopUpManager.createPopUp(this, Popup, true) as Popup;
                popup.addEventListener(Event.CLOSE, popupClose, false, 0, true);
            }

            private function popupClose(e:Event):void {
                trace(popup);
                popupButton.label = "Closed";
            }
        ]]>
    </mx:Script>

</mx:Application>

Popup.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
    <mx:Button x="167" y="123" label="Close me" click="buttonClick(event)"/>

    <mx:Script>
        <![CDATA[
            import mx.managers.PopUpManager;

            private function buttonClick(e:MouseEvent):void {
                dispatchEvent(new Event(Event.CLOSE));
                PopUpManager.removePopUp(this);
            }
        ]]>
    </mx:Script>

</mx:Canvas>

Você também precisa criar uma função de dispor de evento limpo, modelos etc ... em sua pop-up. Caso contrário, ele não será coletado e abrandar o seu aplicativo.

Em sua amostra, movimento PopUpManager.removePopUp(this); ao manipulador de eventos próximo, ou seja, popupClose(e:Event). Você também vai precisar para substituir o this discussão com pop-up.

Não absolutamente certo sobre a forma como se comporta PopUpManager, mas você pode querer mudar as declarações em sua buttonHandler:

function buttonHandler(MouseEvent:event):void
{
    this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
    PopUpManager.remove(this);
}

O pop-up vai ficar para cima enquanto seu código de eventos está sendo executado, mas deve tomar cuidado com a situação em que o objeto pop-up está sendo eliminados antes de acionar o código que se esforça para obter dados a partir dele.

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