2009-04-14 5 views
3

変数を渡すカスタムイベントディスパッチャを構築しました。私はイベントをディスパッチしてから、私のドキュメントルートでイベントを待ち受けようとしますが、イベントを受け取ることはありません。どのようにイベントを自分のドキュメントクラスにバブルさせるのですか?ディスパッチされ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)); 

答えて

4

缶のみバブルアップディスプレイリストをイベントイベントを送出オブジェクトが(例えばスプライトまたはMovieClipとして、またはのDisplayObjectの先祖)のDisplayObjectである場合、それは表示リストとすることができるようにイベント発送時に表示リストに追加されます。

あなたが書いたコードには、クラスの一部としてイベントを送出する行はありません。パッケージ内の関数なので、どこにバブリングするのかわかりません。

クイックフィックスでは、クリックされた同じオブジェクトをクリックするだけでイベントが送出されます。クリックされたので、明らかにステージ上にある表示オブジェクトです。バブリングの2つの条件を満たしています。

+0

それは理にかなっています。うわー!あなたが提供したコードで、なぜevent.targetはevent.currentTarget(hotspotData)の代わりにイベントを送出しますか? – Bryan

+0

event.currentTargetはMouseEventをリスンしていたオブジェクトで、event.targetはMouseEventを送出したオブジェクトです。いずれにせよ、この場合はおそらくあなたのホットスポットです。しかしevent.targetはクリックされたものなので、ステージ上の表示オブジェクトであることを100%知っているので、私はそれを選択しました:) –

+0

ブライアンありがとうございます。この回答はとても明確なので、私はあなたのプロフィールの他の答えのいくつかをチェックアウトしました。私はあなたからたくさんのことを学んでいます。 – Bryan

3

イベントが表示リストをバブルアップします。あなたのコードサンプルから、あなたがイベントをディスパッチしているオブジェクトを教えてくれるわけではありません。クラスに対してメソッドを持っているだけです。そのクラスのインスタンスが表示リストに追加されていますか?

0

バブリングは、イベントをディスパッチするオブジェクトが表示リストにある場合にのみ機能します。ステージの孫がいます。

これは正しく問題ですが、ディスパッチクラスを表示リストに追加するとコードスニペットからはわかりません。

また、カスタムEventDispatcherを作成したのではなく、カスタムイベントを作成したように見えます。しかし、私は間違っている可能性があります(あなたのコードをすべて見ることはできません)。

+0

申し訳ありませんが、私が提供したもののコピーはどうですか? – Stiggler

-1

カスタムイベントを再生するには、ドキュメントクラスのディスパッチャへの有効な参照が必要です。

yourDispatcher.addEventListener(CustomVarEvent.pinClicked、pinClickedHandler);

yourDispatcherは、カスタムイベントをディスパッチするクラスです。

+0

彼はイベントをバブルアップしようとしています... –

+0

はいです。実際それは非常に簡単です。私はいつも使っています。これは最大の利点の継承の1つです。機能を追加するには、何も失うことなく追加できます。 –

+0

私は何かを学んだ...:) – OXMO456

関連する問題