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
}
MyPopup:
function buttonHandler( MouseEvent:event ):void
{
PopUpManager.remove( this );
this.dispatchEvent( new CloseEvent( CloseEvent.CLOSE ) );
}
これが不適切な場合、オブジェクトのデータを使用および取得できる方法でポップアップのクローズを処理する正しい方法は何ですか?
解決
おそらく、ハンドラにイベントパラメータを追加してみてください。 ActionScriptが提供されていないことを常に許容できるかどうかはわかりません。例:
function handler(event:CloseEvent):void {
// Handle away
}
また、ジャスティンが述べたように、ポップアップを閉じる前にハンドラーを呼び出す方法も2番目です。
他のヒント
コードを再作成しましたが、問題なく動作します:(これは、問題を誤解したか、コードのどこかにバグがあることを意味します。
問題に関する詳細を投稿できる可能性はありますか?
サム
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>
また、ポップアップでイベント、モデルなどをクリーンアップするために破棄関数を作成する必要があります。そうしないと、ガベージコレクションが行われず、アプリの速度が低下します。
サンプルで、 PopUpManager.removePopUp(this);
をcloseイベントハンドラー、つまり popupClose(e:Event)
に移動します。また、引数 this
をpopupに置き換える必要があります。
PopUpManagerの動作については確実ではありませんが、buttonHandlerのステートメントを切り替えることをお勧めします。
function buttonHandler(MouseEvent:event):void
{
this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
PopUpManager.remove(this);
}
イベントコードの実行中はポップアップが表示されますが、データを取得しようとするコードを実行する前にポップアップオブジェクトが破棄される状況に注意する必要があります。