플렉스 팝업 창:스택 오버플로?
-
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
}
또한 Justin이 언급한 것처럼 팝업을 닫기 전에 핸들러를 호출하는 방법도 있습니다.
다른 팁
나는 당신의 코드를 재현했고 그것은 나에게 잘 작동합니다 :( 이것은 당신의 문제를 오해했거나 버그가 코드의 다른 곳에 있다는 것을 의미합니다.
문제에 대한 자세한 내용을 게시 할 수 있습니까?
샘
추신 : 여기서 테스트했던 코드는 다음과 같습니다.
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>
팝업 .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);
가까운 이벤트 핸들러에게, 즉 popupClose(e:Event)
. 또한 인수를 대체해야합니다 this
팝업으로.
PopupManager가 어떻게 행동하는지에 대해서는 확실하지 않지만 ButtonHandler의 진술을 전환하고 싶을 수도 있습니다.
function buttonHandler(MouseEvent:event):void
{
this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
PopUpManager.remove(this);
}
이벤트 코드가 실행되는 동안 팝업이 계속 유지되지만 데이터를 얻으려는 코드를 발사하기 전에 팝업 객체가 배치되는 상황을 관리해야합니다.