Pregunta

De alguna manera estoy creando un desbordamiento de pila en Flex 3 ... Estoy tratando de obtener datos de una ventana de diálogo modal como tal:

Aplicación 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 ) );
}

Si esto es incorrecto, ¿cuál es la forma correcta de manejar el cierre de la ventana emergente de una manera que me permita usar y recuperar datos sobre el objeto?

¿Fue útil?

Solución

Quizás podría intentar agregar un parámetro de evento a su controlador. No estoy tan seguro de que ActionScript siempre pueda tolerar que no se proporcione. Ejemplo:

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

También secundo la práctica de llamar al controlador antes de cerrar la ventana emergente como mencionó Justin.

Otros consejos

He recreado su código y funciona bien para mí :( Esto significa que he entendido mal su problema o que el error está en otra parte de su código.

¿Hay alguna posibilidad de que pueda publicar más detalles sobre el problema?

Sam

PD Aquí está el código que solía probar con:

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>

También debe crear una función de eliminación para limpiar eventos, modelos, etc. en su ventana emergente. De lo contrario, no se recolectará basura y ralentizará su aplicación.

En su muestra, mueva PopUpManager.removePopUp (this); al controlador de eventos cercanos, es decir, popupClose (e: Event) . También deberá reemplazar el argumento this con popup.

No estoy absolutamente seguro de cómo se comporta el PopUpManager, pero es posible que desee cambiar las declaraciones en su buttonHandler:

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

La ventana emergente permanecerá activa mientras se está ejecutando el código de su evento, pero debe ocuparse de la situación en la que se desecha el objeto emergente antes de activar el código que intenta obtener datos de él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top