Domanda

In qualche modo sto creando un overflow dello stack in Flex 3 ... Sto cercando di ottenere i dati da una finestra di dialogo modale in quanto tale:

Applicazione principale:

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 ciò non è corretto, qual è il modo corretto di gestire la chiusura del popup in un modo che mi consente di utilizzare e recuperare i dati sull'oggetto?

È stato utile?

Soluzione

Forse potresti provare ad aggiungere un parametro evento al tuo gestore. Non sono così sicuro che ActionScript possa sempre tollerare che non venga fornito. Esempio:

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

Secondo anche la pratica di chiamare il gestore prima di chiudere il popup come menzionato da Justin.

Altri suggerimenti

Ho ricreato il tuo codice e funziona bene per me :( Ciò significa che o ho frainteso il tuo problema o che il bug è da qualche altra parte nel tuo codice.

Qualche possibilità che tu possa pubblicare qualche dettaglio in più sul problema?

Sam

PS Ecco il codice che ho usato per testare 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>

Devi anche creare una funzione dispose per cancellare eventi, modelli ecc ... nel tuo pop-up. In caso contrario, non verrà raccolta rifiuti e rallenterà la tua app.

Nel tuo esempio, sposta PopUpManager.removePopUp (questo); sul gestore eventi vicino, ovvero popupChiudi (e: Event) . Dovrai anche sostituire l'argomento this con popup.

Non sono assolutamente sicuro di come si comporti PopUpManager, ma potresti voler cambiare le istruzioni nel tuo buttonHandler:

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

Il popup rimarrà attivo mentre il codice evento è in esecuzione, ma dovrebbe occuparsi della situazione in cui l'oggetto popup viene eliminato prima di attivare il codice che tenta di ottenere dati da esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top