Как изменить существующие события AS3, чтобы я мог передавать данные? - PullRequest
7 голосов
/ 17 апреля 2009

Итак, я хочу настроить события так, чтобы я мог передавать данные без создания замыканий \ утечек памяти. Это насколько я получил:

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

    public class CustomEvent extends Event {
        public static const REMOVED_FROM_STAGE:String = "removedFromStage";
        public var data:*;

        public function CustomEvent(type:String, customData:*=null, bubbles:Boolean=false, cancelable:Boolean=false) {
            super(type, bubbles, cancelable);
            this.data = customData;
        }

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

        public override function toString():String {
            return formatToString("CustomEvent", "type", "data", "bubbles", "cancelable", "eventPhase");
        }
    }
}

Это вызывает у меня следующее поведение:

function testme(e:Event) {
    trace(e); 
}

test_mc.addEventListener(CustomEvent.REMOVED_FROM_STAGE, testme);
test_mc.dispatchEvent(new CustomEvent(CustomEvent.REMOVED_FROM_STAGE, 42));
//Traces [CustomEvent type="removedFromStage" data=42 bubbles=false cancelable=false eventPhase=2]
removeChild(test_mc);
//Traces [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2]

Моя цель состоит в том, чтобы получить пользовательские данные, которые я хочу передать, для передачи от вспышек событий, а не только те, которые я запускаю. Например, что если я захочу передать мувиклип вместе с событием loader.COMPLETE, чтобы поместить получившееся растровое изображение?

Ответы [ 2 ]

4 голосов
/ 17 апреля 2009

Вы расширили класс Event для его отправки с дополнительными данными, теперь, если вы хотите, чтобы класс Loader отправлял ваш пользовательский тип события, расширьте класс Loader, чтобы сделать это (или любой другой класс, с которым вы хотите это сделать). В этом примере я переопределю URLLoader с этой функциональностью (потому что Loader фактически отправляет события из своего contentLoaderInfo, которому нужны два переопределенных класса, и я просто хочу, чтобы он был простым)


package com.net
{
    import flash.net.URLLoader;
    import flash.events.Event;

    import com.events.CustomEvent;

    public class CustomLoader extends URLLoader
    {
        // URLLoader already has a data property, so I used extraData
        public var extraData:*;

        override public function dispatchEvent(event: Event) : Boolean
        {
            var customEvent: CustomEvent = new CustomEvent(event.type, extraData, event.bubbles, event.cancelable);
            return super.dispatchEvent(customEvent);
        }
    }
}

Теперь, чтобы использовать это с вашим классом CustomEvent, попробуйте этот код в вашем .fla


import com.net.CustomLoader;
import com.events.CustomEvent;

var loader: CustomLoader = new CustomLoader();
loader.extraData = "Extra Data";
loader.load(new URLRequest("test.xml"));
loader.addEventListener(Event.COMPLETE, loadComplete);

function loadComplete(event: CustomEvent) : void
{
    trace(event.data); // Extra Data
}

БАМ! Пользовательские данные о ваших отправленных событиях!

0 голосов
/ 17 апреля 2009

Ниже показан самый чистый способ создания пользовательского события. Как правило, типы событий имеют открытые статические ссылки, набранные всеми прописными буквами. Когда событие отправляется, оно передает объект Event или CustomEvent в метод обработчика события. Здесь вы можете получить переданное вами значение.

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

    public class CustomEvent extends Event 
    {
        public static const VALUE_CHANGED:String = "VALUE_CHANGED";
        public var value:Number;

        public function CustomEvent(pValue:Number) 
        { 
            super(CustomEvent.VALUE_CHANGED);
            value = pValue;
        } 
        public override function clone():Event 
        { 
            return new CustomEvent(value);
        }
    }
}

Когда мы отправляем события, мы создаем новый экземпляр события, которое нужно передать как таковое.

private var _someValue:int = 12;
dispatchEvent(new CustomEvent(_somevalue));
...