2012-09-25 4 views
9

いずれかが私にそれに接続されているオブジェクトとactionscript3にイベントをディスパッチする方法についての簡単な例を与えることができ、resultは、そのオブジェクトでありますイベントと一緒に過ごしたい。- ここ</p> <pre><code>dispatchEvent(new Event(GOT_RESULT,result)); </code></pre> <p>のようなAS3

+1

あなたが例を自分で与えました。あなたはどこにいらっしゃいますか? – bfavaretto

+0

返信いただきありがとうございます。私はas3を初めて使用しており、ディスパッチイベントでオブジェクトを渡す方法を知りたいですか? – user1022521

+1

独自のカスタムイベントオブジェクトを作成するには、Eventクラスを拡張する必要があります。以下の例を参照してください。http://cookbooks.adobe.com/post_AS3__Creating_and_dispatching_Custom_Events-17609.html – bfavaretto

答えて

30

イベントを介してオブジェクトを渡す場合は、カスタムイベントを作成する必要があります。コードはこのようなものでなければなりません。

public class MyEvent extends Event 
{ 
    public static const GOT_RESULT:String = "gotResult"; 

    // this is the object you want to pass through your event. 
    public var result:Object; 

    public function MyEvent(type:String, result:Object, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
     super(type, bubbles, cancelable); 
     this.result = result; 
    } 

    // always create a clone() method for events in case you want to redispatch them. 
    public override function clone():Event 
    { 
     return new MyEvent(type, result, bubbles, cancelable); 
    } 
} 

は、その後、あなたは、このように上記のコードを使用することができます。

dispatchEvent(new MyEvent(MyEvent.GOT_RESULT, result)); 

そして、あなたが必要なこのイベントのために聞きます。

addEventListener(MyEvent.GOT_RESULT, myEventHandler); 
// more code to follow here... 
protected function myEventHandler(event:MyEvent):void 
{ 
    var myResult:Object = event.result; // this is how you use the event's property. 
} 
+0

これはそれを行う方法です。いくつかの小さな追加。私は常にイベントデータのパブリックフィールドの代わりにゲッターフィールドを使用します。また、GOT_RESULTの名前をRESULTに変更して明確にします。 –

+2

Btw私はカスタムas3イベントhttp://projects.stroep.nl/EventGenerator/を作成するためのオンラインツールを作成しました。お気軽にご利用ください。 –

+1

私はイベント定数の名前をRESULTに変更することに同意します。私は、混乱を避けるために、OPの変数名に可能な限り近いものを維持しようとしていました。 –

0

正しく設計されていれば、イベントにオブジェクトを渡す必要はありません。
代わりに、ディスパッチクラスにpublic varを作成する必要があります。

public var myObject:Object; 

// before you dispatch the event assign the object to your class var 
myObject = ....// whatever it is your want to pass 
// When you dispatch an event you can do it with already created events or like Tomislav wrote and create a custom class. 

// in the call back just use currentTarget 
public function myCallBackFunction(event:Event):void{ 

    // typecast the event target object 
    var myClass:myClassThatDispatchedtheEvent = event.currentTarget as myClassThatDispatchedtheEvent 
    trace(myClass.myObject)// the object or var you want from the dispatching class. 


+0

オブジェクトを渡すことは、設計上の決定が悪いということですか、あるいは代替案を提示するだけですか?私はFlash/Flex APIがオブジェクトをかなり頻繁に渡すように見えるので頼んでいる。 – bfavaretto

+4

あなたがちょうど言ったことを私が理解すれば;私は正直に反対します。イベントオブジェクトに値を追加すると、カプセル化が有効になります。多くの場合、現行のターゲット(またはターゲット)をイントロスペクトして、インスタンス上のパブリック・バールからデータを取り出すのではなく、そのアプローチを使用します。私はこれが特に有益であることを発見しました。イベントが表示階層内の複数のレベルにバブルアップする表示リストでは、 – JeffryHouser

+3

私はこの方法論を時々使用しますが、すべてのシナリオに適しているわけではありません(最初の文で示唆される)。たとえば、同じイベントをディスパッチする複数のクラスがある(しかし、共通のサブクラスを持たない)場合、カスタムイベントはよりクリーンなルートになります。さらに、興味の分離について何か言われることがあります。イベントをディスパッチするクラスが、イベントをリスン/処理しているクラスについて知る必要がない場合は、カスタムイベントもその状況に適しています。ユニットテストがずっと楽になります – BadFeelingAboutThis

3

この投稿は少し古いですが、それが誰かを助けることができるならば、あなたはとても似によってDataEventクラスを使用することができます。

dispatchEvent(new DataEvent(YOUR_EVENT_ID, true, false, data)); 

Documentation

関連する問題