フレックス:特定のイベントを処理できないのはなぜですか?
-
02-07-2019 - |
質問
場合によっては、イベントを受信するコンポーネントを取得できないようです。
[編集]
明確にするために、サンプル コードはデモンストレーションのみを目的としており、私が実際に尋ねていたのは、任意のオブジェクトとの間でイベントを確実に送受信できる、リスナーを追加できる中心的な場所があるかどうかでした。
結局、parentApplication を使用して、処理する必要のあるイベントを送受信することになりました。
[/編集]
2 つのコンポーネントの親が異なる場合、または以下の例のように 1 つがポップアップである場合、イベントはリスナーに到達しないように見えます (機能しないディスパッチについてはメソッド "popUp" を参照してください)。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
initialize="init()">
<mx:Script>
<![CDATA[
import mx.controls.Menu;
import mx.managers.PopUpManager;
// Add listeners
public function init():void
{
this.addEventListener("child", handleChild);
this.addEventListener("stepchild", handleStepchild);
}
// Handle the no pop button event
public function noPop(event:Event):void
{
dispatchEvent(new Event("child"));
}
// Handle the pop up
public function popUp(event:Event):void
{
var menu:Menu = new Menu();
var btnMenu:Button = new Button();
btnMenu.label = "stepchild";
menu.addChild(btnMenu);
PopUpManager.addPopUp(menu, this);
// neither of these work...
this.callLater(btnMenu.dispatchEvent, [new Event("stepchild", true)]);
btnMenu.dispatchEvent(new Event("stepchild", true));
}
// Event handlers
public function handleChild(event:Event):void
{
trace("I handled child");
}
public function handleStepchild(event:Event):void {
trace("I handled stepchild");
}
]]>
</mx:Script>
<mx:VBox>
<mx:Button label="NoPop" id="btnNoPop" click="noPop(event)"/>
<mx:Button label="PopUp" id="btnPop" click="popUp(event)"/>
</mx:VBox>
</mx:Application>
回避策は考えられますが、中央イベントバスが必要なようです...
何かが足りないのでしょうか?
解決
上記が正しいです。btnMenu からイベントをディスパッチしていますが、btnMenu でイベントをリッスンしているのではなく、アプリケーションでイベントをリッスンしています。
アプリケーションからディスパッチする:
dispatchEvent(new Event("stepchild", true));
またはbtnMenuで聞いてください
btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));
他のヒント
リスナーをアタッチしています this
イベントが送信されるとき btnMenu
.
これは機能するはずです:
dispatchEvent(new Event("stepchild", true));
ps。不要な ' を付ける理由は実際にはありませんthis
' スコープの問題を解決するために明示的に必要でない限り、どこでも。この場合、毎回そのままにすることができます this
外。
所属していません StackOverflow