Actionscript 3 Actionscript 3.0中的一般事件和附加参数?

Actionscript 3 Actionscript 3.0中的一般事件和附加参数?,actionscript-3,events,Actionscript 3,Events,假设以下模式: someObjectInstance.addEventListener(MyDisplayObject.EVENT_CONSTANT, _handleMyEvent); private function _handleMyEvent( event:Event = null ):void { // Event handler logic... } 如果我想向handler函数添加一个必需的参数,我是否能够做到这一点,并且仍然使用“通用”事件和事件侦听器?或者,我是否正确地

假设以下模式:

someObjectInstance.addEventListener(MyDisplayObject.EVENT_CONSTANT, _handleMyEvent);


private function _handleMyEvent( event:Event = null ):void
{
  // Event handler logic...
}
如果我想向handler函数添加一个必需的参数,我是否能够做到这一点,并且仍然使用“通用”事件和事件侦听器?或者,我是否正确地假设需要创建一个自定义事件类,该类中包含参数,并通过传递给处理程序函数的事件对象引用该参数

换一种说法。。。如果我有一个如下所示的处理函数:

private function _handleMyEvent( data:Object, event:Event = null ):void
{
  if (data == null)
  {
      return;
  }
  // Event handler logic...
}
那么addEventListener函数需要看起来像什么?有更高级的语法吗?有没有一种方法可以通过闭包实现这一点


寻找清晰的代码示例和/或文档参考。只是想了解在这种情况下我是否一定要覆盖通用事件类。

如果需要自定义数据随事件一起移动,则需要创建自定义事件类

下面是一个简单的例子:

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);
        }
    }
}
请注意,克隆方法不是可选的。您必须在自定义类中具有此方法,才能正确地重新广播事件(例如,当一个对象获取事件,然后将其作为自己的对象重新分派)

现在,对于调度事件,它的工作方式是这样的(显然,这段代码将放在扩展EventDispatcher的类方法中)

最后,订阅活动:

function onChangeColor(event:ColorEvent):void {
    trace(event.color);
}

foo.addEventListener(ColorEvent.CHANGE_COLOR, onChangeColor);

如果需要自定义数据随事件一起移动,则需要创建自定义事件类

下面是一个简单的例子:

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);
        }
    }
}
请注意,克隆方法不是可选的。您必须在自定义类中具有此方法,才能正确地重新广播事件(例如,当一个对象获取事件,然后将其作为自己的对象重新分派)

现在,对于调度事件,它的工作方式是这样的(显然,这段代码将放在扩展EventDispatcher的类方法中)

最后,订阅活动:

function onChangeColor(event:ColorEvent):void {
    trace(event.color);
}

foo.addEventListener(ColorEvent.CHANGE_COLOR, onChangeColor);

有一种方法可以将自定义数据传递给处理程序方法,而无需创建自定义事件

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);
    };
}

有一种方法可以将自定义数据传递给处理程序方法,而无需创建自定义事件

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);
    };
}

大家等一下。看

您根本不需要定制任何东西来通过侦听器引用参数。是的,戈登,你可以用你的普通事件和事件监听器做到这一点

而且很简单!addEventListener函数保持不变。它的监听器将被调整:

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
    }
  }
}
没有高级语法,但有一个相对高级的概念:。你可以用我们这里的闭包,但你绝对不需要。这样,您也绝对不需要重写事件类


我希望这些示例和文档能够为您澄清

大家等一下。看

您根本不需要定制任何东西来通过侦听器引用参数。是的,戈登,你可以用你的普通事件和事件监听器做到这一点

而且很简单!addEventListener函数保持不变。它的监听器将被调整:

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
    }
  }
}
没有高级语法,但有一个相对高级的概念:。你可以用我们这里的闭包,但你绝对不需要。这样,您也绝对不需要重写事件类


我希望这些示例和文档能够为您澄清

在我的例子中,我创建了一个自定义事件类,它可以接受一个参数数组,如果我想使其唯一,只需自定义事件名称。实际上,从长远来看,我发现最小的、更通用的事件名称比特定的名称更容易维护。因为处理事件的对象通常为您提供足够的上下文来理解代码,所以麻烦更少了。但是没有错误的答案。只是样式首选项。指出重写clone()方法不是可选的,文档中没有正确解释。谢谢!在我的例子中,我创建了一个自定义事件类,它可以接受一个参数数组,如果我想使其唯一,只需自定义事件名称。实际上,从长远来看,我发现最小的、更通用的事件名称比特定的名称更容易维护。因为处理事件的对象通常为您提供足够的上下文来理解代码,所以麻烦更少了。但是没有错误的答案。只是样式首选项。指出重写clone()方法不是可选的,文档中没有正确解释。谢谢!