Ventana emergente Flex: ¿Desbordamiento de pila?
-
06-07-2019 - |
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?
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.