Вопрос

Я каким-то образом создаю переполнение стека во Flex 3...Я пытаюсь получить данные из модального диалогового окна как такового:

Основное применение:

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
}

МиПопуп:

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

Если это неправильно, каков правильный способ обработать закрытие всплывающего окна таким образом, чтобы я мог использовать и извлекать данные об объекте?

Это было полезно?

Решение

Возможно, вы могли бы попробовать добавить параметр события в свой обработчик.Я не так уверен, что ActionScript всегда может мириться с тем, что это не предусмотрено.Пример:

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

Я также поддерживаю практику вызова обработчика перед удалением всплывающего окна, как упоминал Джастин.

Другие советы

Я воссоздал ваш код, и у меня он работает нормально: ( Это означает, что либо я неправильно понял вашу проблему, либо ошибка кроется где-то в другом месте вашего кода.

Есть ли шанс, что вы сможете опубликовать более подробную информацию об этой проблеме?

Сэм

PS Вот код, который я использовал для тестирования с :

Приложение.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>

Всплывающее окно.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>

Вам также необходимо создать функцию dispose для очистки событий, моделей и т.д...в вашем всплывающем окне.В противном случае это не будет сбор мусора и замедлит работу вашего приложения.

В вашем образце переместите PopUpManager.removePopUp(this); к обработчику события закрытия, т. е., popupClose(e:Event).Вам также нужно будет заменить аргумент this с всплывающим окном.

Не совсем уверен в том, как ведет себя PopUpManager, но вы можете захотеть переключить инструкции в вашем buttonHandler:

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

Всплывающее окно будет работать, пока выполняется ваш код события, но оно должно позаботиться о ситуации, когда ваш всплывающий объект удаляется, прежде чем вы запустите код, который пытается получить от него данные.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top