2012-09-25 25 views
9

Może ktoś dać mi prosty przykład jak wysyłką zdarzenie w ActionScript3 z obiektem z nim związane, jakJak wysyłką zdarzenie z dodatkowymi danymi - AS3

dispatchEvent(new Event(GOT_RESULT,result)); 

Tutaj result jest obiektem Chcę przekazać wraz z wydarzeniem.

+1

Dałeś Przykładem siebie. Gdzie dokładnie utknąłeś? – bfavaretto

+0

Dzięki za odpowiedź, jestem nowy w as3 i chciałbym wiedzieć, jak przekazać obiekt ze zdarzeniem wysyłki? – user1022521

+1

Należy rozszerzyć klasę Event, aby utworzyć własny niestandardowy obiekt zdarzenia. Zobacz przykład tutaj: http://cookbooks.adobe.com/post_AS3__Creating_and_dispatching_Custom_Events-17609.html – bfavaretto

Odpowiedz

30

Jeśli chcesz przekazać obiekt przez wydarzenie, powinieneś utworzyć zdarzenie niestandardowe. Kod powinien być podobny do tego.

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

Następnie można użyć powyższy kod tak:

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

I nasłuchiwać tego zdarzenia w miarę potrzeby.

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

Tak należy to zrobić. Kilka małych dodatków; Zawsze korzystam z pola getter zamiast z pola publicznego dla danych zdarzeń. Zmieniłbym również GOT_RESULT na RESULT, aby było jasne. –

+2

Btw Stworzyłem narzędzie online do tworzenia niestandardowych zdarzeń as3 http://projects.stroep.nl/EventGenerator/ może pomóc w szybszej konfiguracji. Zapraszam do korzystania. –

+1

Zgadzam się na zmianę nazwy stałej zdarzenia na WYNIK, starałem się trzymać rzeczy jak najbardziej zbliżone do nazw zmiennych przykładowych OP, aby uniknąć jakichkolwiek nieporozumień, które mogą się pojawić. –

0

Jeśli jest właściwie zaprojektowany, nie powinno się przekazywać obiektu na to wydarzenie.
Zamiast tego powinieneś publicznie zmienić klasę wysyłkową.

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

Czy mówisz, że przekazanie obiektu to zła decyzja projektowa lub po prostu alternatywa? Pytam, ponieważ interfejsy API Flash/Flex wydają się przekazywać obiekty dość często. – bfavaretto

+4

Jeśli rozumiem, co właśnie powiedziałeś; Z całym szacunkiem się nie zgadzam. Dodawanie wartości do obiektów zdarzeń jest dobrą enkapsulacją. W wielu przypadkach wolałbym takie podejście, a nie introspekcję bieżącego celu (lub celu) w celu pobrania danych z publicznych zmiennych dotyczących instancji. Uważam, że jest to szczególnie korzystne na liście wyświetlania, w której zdarzenie spowoduje pojawienie się wielu poziomów w hierarchii wyświetlania. – JeffryHouser

+3

Podczas gdy używam tej metodologii czasami, nie pasuje ona do każdego scenariusza (sugerowałoby to twoje pierwsze zdanie). np. jeśli masz wiele klas, które wysyłają to samo zdarzenie (ale nie masz wspólnej podklasy), w tych przypadkach zdarzenie niestandardowe jest znacznie czystszą drogą. Poza tym jest coś do powiedzenia na temat oddzielenia odsetek.Jeśli klasa, która wywołuje zdarzenie, nie ma powodu, aby wiedzieć o klasie, która nasłuchuje/obsługuje wydarzenie, to zdarzenie niestandardowe jest również lepsze dla tej sytuacji. Sprawia, że ​​testowanie jednostki jest DUŻO łatwiejsze. – BadFeelingAboutThis

3

Ten post jest trochę stary, ale jeśli to może pomóc komuś, można użyć klasy DataEvent tak:

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

Documentation