Всплывающее окно Flex:Переполнение стека?
-
06-07-2019 - |
Вопрос
Я каким-то образом создаю переполнение стека во 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);
}
Всплывающее окно будет работать, пока выполняется ваш код события, но оно должно позаботиться о ситуации, когда ваш всплывающий объект удаляется, прежде чем вы запустите код, который пытается получить от него данные.