2012-09-25 12 views
9

Kann jemand geben Sie mir ein einfaches Beispiel dafür, wie ein Ereignis in ActionScript3 mit einem Objekt mit ihm verbunden schicken, wieWie ein Ereignis mit zusätzlichen Daten versenden - AS3

dispatchEvent(new Event(GOT_RESULT,result)); 

Hier result ist ein Objekt, Ich möchte mit dem Event weitermachen.

+1

Sie gab ein Beispiel selbst. Wo genau stecken Sie fest? – bfavaretto

+0

Danke für die Antwort, ich bin neu bei as3 und würde gerne wissen, wie man ein Objekt mit Dispatch-Event übergibt? – user1022521

+1

Sie müssen die Ereignisklasse erweitern, um ein eigenes benutzerdefiniertes Ereignisobjekt zu erstellen. Sehen Sie ein Beispiel hier: http://cookbooks.adobe.com/post_AS3__Creating_and_dispatching_Custom_Events-17609.html – bfavaretto

Antwort

30

Wenn Sie ein Objekt durch ein Ereignis übergeben möchten, sollten Sie ein benutzerdefiniertes Ereignis erstellen. Der Code sollte in etwa so sein.

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); 
    } 
} 

Dann können Sie den angezeigten Code wie folgt verwenden:

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

Und Sie hören für diese Veranstaltung, wo nötig.

+0

So sollte es gemacht werden. Einige kleine Ergänzungen; Ich verwende immer ein Getter-Feld anstelle eines öffentlichen Feldes für Ereignisdaten. Ich würde auch GOT_RESULT in RESULT umbenennen, um es klar zu halten. –

+2

Btw Ich habe ein Online-Tool erstellt, um benutzerdefinierte as3-Ereignisse zu erstellen http://projects.stroep.nl/EventGenerator/ es könnte helfen, Setup schneller. Fühlen Sie sich frei zu benutzen. –

+1

Ich bin damit einverstanden, die Ereigniskonstante in RESULT umzubenennen, ich habe nur versucht, die Variablennamen des OPs so nah wie möglich zu halten, um jede mögliche Verwirrung zu vermeiden. –

0

Bei richtiger Gestaltung sollten Sie kein Objekt an das Ereignis übergeben müssen.
Stattdessen sollten Sie eine öffentliche var auf der Dispatching-Klasse machen.

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

Sie sagen, dass das Übergeben eines Objekts eine schlechte Designentscheidung ist oder nur eine Alternative gibt? Ich frage, weil die Flash/Flex APIs Objekte ziemlich häufig passieren. – bfavaretto

+4

Wenn ich verstehe, was Sie gerade gesagt haben; Ich stimme dem nicht zu. Das Hinzufügen von Werten zu Ereignisobjekten ist eine gute Kapselung. In vielen Fällen würde ich diesen Ansatz bevorzugen, anstatt das currentTarget (oder Ziel) zu untersuchen, um Daten von öffentlichen vars auf einer Instanz abzurufen. Ich finde das besonders nützlich in einer Anzeigeliste, in der ein Ereignis mehrere Ebenen in der Anzeigehierarchie durchleuchtet. – JeffryHouser

+3

Während ich diese Methode manchmal verwende, ist es nicht für jedes Szenario geeignet (der erste Satz würde das nahelegen). Wenn Sie beispielsweise mehrere Klassen haben, die dasselbe Ereignis senden (aber keine gemeinsame Unterklasse haben), ist ein benutzerdefiniertes Ereignis in diesen Fällen eine viel sauberere Route. Außerdem gibt es etwas über die Trennung von Interesse zu sagen.Wenn die Klasse, die das Ereignis auslöst, keinen Grund hat, über die Klasse zu wissen, die das Ereignis überwacht/verarbeitet, ist ein benutzerdefiniertes Ereignis auch für diese Situation besser geeignet. Macht Unit-Test VIEL einfacher – BadFeelingAboutThis

3

Dieser Beitrag ist ein wenig alt, aber wenn es jemand helfen kann, können Sie Dataevent-Klasse wie so verwenden:

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

Documentation