変数を渡すカスタムイベントディスパッチャを構築しました。私はイベントをディスパッチしてから、私のドキュメントルートでイベントを待ち受けようとしますが、イベントを受け取ることはありません。どのようにイベントを自分のドキュメントクラスにバブルさせるのですか?ディスパッチされactionscript 3クラスからカスタムイベントをディスパッチし、それをドキュメントルートでリッスンするにはどうすればよいですか?
addEventListener(CustomVarEvent.pinClicked, pinClickedHandler);
function pinClickedHandler(e:CustomVarEvent) {
trace("main says " + e.arg[0] + " clicked");//access arguments array
}
package zoomify.viewer
{
import com.maps.CustomVarEvent;
protected function hotspotClickHandler(event:MouseEvent):void {
var hotspotData:Hotspot = hotspotsMap[event.currentTarget] as Hotspot;
trace(hotspotData._name + " was clicked");
/*if(hotspotData) {
navigateToURL(new URLRequest(hotspotData.url), hotspotData.urlTarget);
}*/
dispatchEvent(new CustomVarEvent("pinClicked",true,false,hotspotData._name));
}
}
package com.maps
{
// Import class
import flash.events.Event;
// CustomVarEvent
public class CustomVarEvent extends Event {
public static const pinClicked:String = "pinClicked";
// Properties
public var arg:*;
// Constructor
public function CustomVarEvent(type:String, ... a:*) {
var bubbles:Boolean = true;
var cancelable:Boolean = false;
super(type, bubbles, cancelable);
arg = a;
}
// Override clone
override public function clone():Event{
return new CustomVarEvent(type, arg);
};
}
}
pinClickedイベントはクラスの深い2つのレベルがネストされています。私はクラスZoomifyViewerのインスタンスをステージに追加します。 ZoomifyViewerがZoomGridのインスタンスをステージに追加し、ZoomGridがイベントを送出します。
同じイベントリスナーとハンドラ関数をZoomGridクラス(イベントが送出されるクラスと同じクラス)に直接追加すると、リスナとハンドラが正常に動作します。しかし、リスナーとハンドラが親クラスまたはステージ上にある場合、私は応答を得ません。
ディスパッチャがバブルアップしてバブルアップする必要がありますか?
また、私のCustomVarEventで定義されている定数pinClickedに基づいて、これら2つの行は機能的に同じですか?
dispatchEvent(new CustomVarEvent(CustomVarEvent.pinClicked, hotspotData._name));
dispatchEvent(new CustomVarEvent("pinClicked", hotspotData._name));
それは理にかなっています。うわー!あなたが提供したコードで、なぜevent.targetはevent.currentTarget(hotspotData)の代わりにイベントを送出しますか? – Bryan
event.currentTargetはMouseEventをリスンしていたオブジェクトで、event.targetはMouseEventを送出したオブジェクトです。いずれにせよ、この場合はおそらくあなたのホットスポットです。しかしevent.targetはクリックされたものなので、ステージ上の表示オブジェクトであることを100%知っているので、私はそれを選択しました:) –
ブライアンありがとうございます。この回答はとても明確なので、私はあなたのプロフィールの他の答えのいくつかをチェックアウトしました。私はあなたからたくさんのことを学んでいます。 – Bryan