Изпращане на персонализирани събития

Опитвам се да задействам събитие от подклас, имам 3 класа; EventHandler, MainClass, SubClass

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: Грешка #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-class не е манипулатор.   -  person Mark Knol    schedule 24.05.2012
comment
@Art е правилен, полето за параметри липсва. Но освен това, вие злоупотребявате с термина манипулатор на събития, за да назовете персонализирано събитие, което може да доведе до всякакви недоразумения: събитие се изпраща от dispatcher, докато *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
Но не мога да изпратя това събитие от SubClass, когато е невярно - 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 и той работи, но имам нужда от params - person Kaner TUNCEL; 24.05.2012