Всплывающее окно Flex: переполнение стека? - PullRequest
2 голосов
/ 18 июня 2009

Я как-то создаю переполнение стека во 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
}

MyPopup:

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

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

Ответы [ 5 ]

1 голос
/ 27 ноября 2009

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

1 голос
/ 19 сентября 2009

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

1 голос
/ 20 июня 2009

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

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

Sam

PS Вот код, с которым я тестировал:

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>
1 голос
/ 21 июня 2009

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

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

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

0 голосов
/ 18 июня 2009

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

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

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

...