2

我以某种方式在 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 ) );
}

如果这是不正确的,那么以允许我使用和检索对象数据的方式处理弹出窗口的正确方法是什么?

4

5 回答 5

1

我已经重新创建了你的代码,它对我来说很好:(这意味着要么我误解了你的问题,要么错误在你的代码中的其他地方。

您是否有机会发布有关该问题的更多详细信息?

山姆

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>
于 2009-06-20T11:24:36.457 回答
1

也许您可以尝试向您的处理程序添加一个事件参数。我不太确定 ActionScript 是否总能容忍不提供的情况。例子:

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

我还支持在 Justin 提到的关闭弹出窗口之前调用处理程序的做法。

于 2009-06-21T18:49:09.560 回答
1

在您的示例中,移至PopUpManager.removePopUp(this);关闭事件处理程序,即popupClose(e:Event). 您还需要将参数替换为this弹出窗口。

于 2009-09-18T22:00:30.750 回答
1

您还需要在弹出窗口中创建一个 dispose 函数来清理事件、模型等。否则它不会被垃圾收集并减慢您的应用程序。

于 2009-11-27T01:04:55.937 回答
0

不确定 PopUpManager 的行为方式,但您可能希望在 buttonHandler 中切换语句:

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

当您的事件代码运行时,弹出窗口会一直保持,但它应该在您触发尝试从中获取数据的代码之前处理您的弹出对象被释放的情况。

于 2009-06-18T19:19:59.230 回答