Диспетчеризация пользовательских событий

Я пытаюсь запустить событие из подкласса, у меня есть 3 класса; Обработчик событий, основной класс, подкласс

EventHandler.as

    public class EventHandler extends Event
{
    public static const TEST_EVENT:String = "Test"; 

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

    public override function clone():Event
    {
        return new EventHandler(type, this.params, bubbles, cancelable);
    }

}

MainClass.as

        public function MainClass()
    {
        addEventListener(EventHandler.TEST_EVENT, testFunc);

    }


    private function testFunc(e:EventHandler){
        trace("OK");
    }

Подкласс.as

private function CustomFunction(event:MouseEvent):void {
        dispatchEvent(new EventHandler(EventHandler.TEST_EVENT,customObject));

    }

Я получаю сообщение VerifyError: Error #1063: flash.events::Event() Что не так с моим архитектором? Спасибо!


person Kaner TUNCEL    schedule 24.05.2012    source источник
comment
Хм, а где твоя переменная params в твоей EventHandler? Как this.params = $params; компилируется?   -  person Art    schedule 24.05.2012
comment
EventHandler — неправильно выбранное имя класса, поскольку сам класс Event не является обработчиком.   -  person Mark Knol    schedule 24.05.2012
comment
@Art верен, поле params отсутствует. Но помимо этого, вы неправильно используете термин обработчик событий для обозначения пользовательского события, что может привести ко всевозможным недоразумениям: событие отправляется из диспетчер, а *handler — это функция, которая вызывается, когда событие получено прослушивателем (он обрабатывает событие).   -  person weltraumpirat    schedule 24.05.2012
comment
Определение параметров объекта решило проблему. Спасибо.   -  person Kaner TUNCEL    schedule 24.05.2012
comment
Между прочим, я знаю архитектора и название не в порядке, но я не смог найти источник, чтобы построить хорошо архитектора.   -  person Kaner TUNCEL    schedule 24.05.2012


Ответы (2)


Удалить $params из super($type,$params, $bubbles, $cancelable); Вот так:

public class EventHandler extends Event
{
    public static const TEST_EVENT:String = "Test"; 

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

    public var params:Object;

    public override function clone():Event
    {
        return new EventHandler(type, this.params, bubbles, cancelable);
    }

}
person Art    schedule 24.05.2012
comment
Как это сделать без пузырей - person Kaner TUNCEL; 24.05.2012
comment
то есть без всплытия по умолчанию установлено значение false, как в моем примере :) - person Neil; 24.05.2012
comment
Но я не могу отправить это событие из подкласса, когда оно ложно - person Kaner TUNCEL; 24.05.2012
comment
Именно так вы должны определить свои пользовательские события. Вы можете изменить количество аргументов или их типы, но все остальное, начиная с диспетчеризации и обработки, должно быть изменено. - person Art; 24.05.2012

Определите пользовательское событие, например:

  package com.mysite.events 
  {
     import flash.events.Event;

    public class PendingEvent extends Event 
    {
    public var payload:Object = {};
    public static const CONTENT_COMPLETE:String = "contentComplete";

    public function PendingEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
        super(type, bubbles, cancelable);

    } 

    public override function clone():Event 
    { 
        return new PendingEvent(type, bubbles, cancelable);
    } 


}

}

В другом месте отправка, как:

    var event:PendingEvent = new PendingEvent(PendingEvent.CONTENT_COMPLETE);
    event.payload.someStuff = "stuff";
    event.payload.moreStuff = "moreStuff"
    dispatchEvent(event);

Тогда послушайте где-нибудь в другом месте:

    this.component.addEventListener(PendingEvent.CONTENT_COMPLETE, componentContentComplete);

    private function componentContentComplete(event:PendingEvent):void 
    {
                    // remove listener
        this.component.removeEventListener(PendingEvent.CONTENT_COMPLETE, componentContentComplete);

                    // do something useful with payload
        var payload:Object = event.payload;
                    trace(payload.someStuff); // stuff
                    trace(payload.moreStuff); // moreStuff
    }

ИЗМЕНИТЬ:

Очевидно, что вы не стали бы использовать Object для своей полезной нагрузки, вместо этого создайте другой типизированный класс по вашему выбору и установите реквизиты для этого объекта, но вы поняли идею.

person Neil    schedule 24.05.2012
comment
Извините, но я не увидел разницы между моим кодом и вашим? - person Kaner TUNCEL; 24.05.2012
comment
Я удалил параметр params, и это сработало, но мне нужны параметры - person Kaner TUNCEL; 24.05.2012