Как отправить событие с добавленными данными — AS3

Может ли кто-нибудь дать мне простой пример того, как отправить событие в actionscript3 с прикрепленным к нему объектом, например

dispatchEvent( new Event(GOT_RESULT,result));

Здесь result — это объект, который я хочу передать вместе с событием.


person user1022521    schedule 25.09.2012    source источник
comment
Вы сами привели пример. Где именно ты застрял?   -  person bfavaretto    schedule 25.09.2012
comment
Спасибо за ответ, я новичок в as3 и хотел бы знать, как передать объект с событием отправки?   -  person user1022521    schedule 25.09.2012
comment
Вы должны расширить класс Event, чтобы создать свой собственный объект события. См. пример здесь: cookbooks.adobe.com/   -  person bfavaretto    schedule 26.09.2012
comment
В моем случае результат имеет тип classA, поэтому я не уверен, нужно ли мне писать пользовательское событие или нет, если мне нужно, как его написать.   -  person user1022521    schedule 26.09.2012


Ответы (3)


Если вы хотите передать объект через событие, вы должны создать собственное событие. Код должен быть примерно таким.

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.
}
person Tomislav Dyulgerov    schedule 25.09.2012
comment
Вот как это должно быть сделано. Некоторые небольшие дополнения; Я всегда использую поле геттера вместо общедоступного поля для данных события. Я бы также переименовал GOT_RESULT в RESULT, чтобы не запутаться. - person Mark Knol; 26.09.2012
comment
Кстати, я создал онлайн-инструмент для создания пользовательских событий as3 projects.stroep.nl/EventGenerator, это может помочь настроить быстрее. Не стесняйтесь использовать. - person Mark Knol; 26.09.2012
comment
Я согласен с переименованием константы события в RESULT, я просто пытался сделать все как можно ближе к именам переменных примера OP, чтобы избежать путаницы, которая может возникнуть. - person Tomislav Dyulgerov; 26.09.2012
comment
@ Томислав Дюльгеров: Эй, спасибо, чувак... твой код абсолютно сработал, спасибо за всю помощь, я ценю это. - person user1022521; 27.09.2012

Этот пост немного устарел, но если он может кому-то помочь, вы можете использовать класс DataEvent следующим образом:

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

Документация

person g0tcha-    schedule 04.05.2016

При правильном дизайне вам не нужно передавать объект в событие.
Вместо этого вы должны создать публичную переменную в классе диспетчеризации.

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.


person The_asMan    schedule 25.09.2012
comment
Вы говорите, что передача объекта — это плохое дизайнерское решение, или просто предлагаете альтернативу? Я спрашиваю, потому что API-интерфейсы Flash/Flex довольно часто передают объекты. - person bfavaretto; 26.09.2012
comment
Если я понимаю, что вы только что сказали; Я с уважением не согласен. Добавление значений к объектам событий является хорошей инкапсуляцией. Во многих случаях я бы предпочел этот подход, а не самоанализ currentTarget (или target) для извлечения данных из общедоступных переменных экземпляра. Я нахожу это особенно полезным в списке отображения, где событие всплывает на несколько уровней в иерархии отображения. - person JeffryHouser; 26.09.2012
comment
Хотя я иногда использую эту методологию, она не подходит для каждого сценария (ваше первое предложение предполагает это). например, если у вас есть несколько классов, которые отправляют одно и то же событие (но не имеют общего подкласса), в этих случаях настраиваемое событие является более простым путем. Плюс есть кое-что, что можно сказать о разделении интересов. Если у класса, который отправляет событие, нет причин знать о классе, который прослушивает/обрабатывает событие, то для этой ситуации также лучше использовать специальное событие. Делает модульное тестирование НАМНОГО проще - person BadFeelingAboutThis; 26.09.2012
comment
Вау, это кажется щекотливой темой - person The_asMan; 26.09.2012
comment
@bfavaretto Да, это имелось в виду скорее как альтернатива. У каждого узора есть свои плюсы и минусы. - person The_asMan; 26.09.2012
comment
@LondonDrugs_MediaServices Я не согласен. В моем примере диспетчерский объект может хранить данные в своей собственной переменной и при этом считаться инкапсулированным. Вы всегда можете реализовать интерфейс, если хотите показывать только определенные члены. В любом случае это выходит далеко за рамки вопроса, и я просто добавлял еще один метод для раскрытия данных. - person The_asMan; 26.09.2012