Generic events and additional parameters in Actionscript 3.0?

后端 未结 3 1398
没有蜡笔的小新
没有蜡笔的小新 2021-01-25 18:23

Assuming the following pattern:

someObjectInstance.addEventListener(MyDisplayObject.EVENT_CONSTANT, _handleMyEvent);


private function _handleMyEvent( event:Eve         


        
相关标签:
3条回答
  • 2021-01-25 19:03

    There is a way of passing custom data to the handler method without creating a custom event.

    private function test() {
        var data : SomeObject = new SomeObject;
        var a:SomeEventDispatcher = new SomeEventDispatcher();
        a.addEventListener(Event.COMPLETE, handle(data));   
        a.dispatchCompleteEvent();
    }
    
    private function handle(data : SomeObject) : Function {
        return function(e : Event) : void {
           IEventDispatcher(e.target).removeEventListener(Event.COMPLETE, arguments.callee);
           trace(e + ", " + data);
        };
    }
    
    0 讨论(0)
  • 2021-01-25 19:05

    If you need custom data to travel with your event, yes, you need to create a custom event class.

    Here's a simple example:

    package {
        import flash.events.Event;
    
        public class ColorEvent extends Event {
            public static const CHANGE_COLOR:String = "ChangeColorEvent";
    
            public var color:uint;
    
            public function ColorEvent(type:String, color:uint, bubbles:Boolean = false, cancelable:Boolean = false) {
                this.color = color;
                super(type, bubbles, cancelable);
            }
    
            override public function clone():Event {
                return new ColorEvent(type, color, bubbles, cancelable);
            }
        }
    }
    

    Please note that the clone method is NOT optional. You must have this method in your custom class for your event to ever be re-broadcast properly (say when one object gets the event, and then re-dispatches it as it's own).

    Now as for dispatching the event, that would work like this (obviously this code would go in a method of class that extends EventDispatcher).

    dispatchEvent(new ColorEvent(ColorEvent.CHANGE_COLOR, 0xFF0000));
    

    And finally, to subscribe to the event:

    function onChangeColor(event:ColorEvent):void {
        trace(event.color);
    }
    
    foo.addEventListener(ColorEvent.CHANGE_COLOR, onChangeColor);
    
    0 讨论(0)
  • 2021-01-25 19:17

    Wait a minute, everybody. See this answer.

    You don't need to customize anything at all to reference the parameter through the listener. So, yes, Gordon, you're able to do this with your average event and event listener.

    And it's way simple! The addEventListener function stays the same. Its listener is what will be adjusted:

    var functionHandleMyEvent:Function = _handleMyEvent(data);
    someObjectInstance.addEventListener(MyDisplayObject.EVENT_CONSTANT, functionHandleMyEvent);
    // Later, when you need to remove it, do:
    //someObjectInstance.removeEventListener(MyDisplayObject.EVENT_CONSTANT, functionHandleMyEvent);
    
    private function _handleMyEvent(data:Object):Function {
      return function(event:Event):void {
        if (data == null) {
          // Event handler logic here now has both "event" and "data" within your reach
        }
      }
    }
    

    No advanced syntax, but a relatively advanced concept: variable functions. You can do closures with what we have here, but you absolutely won't need to. And like that, you also absolutely won't need to override the Event class.

    I hope these examples and documentation are clarifying for you!

    0 讨论(0)
提交回复
热议问题