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()方法不是可选的,文档中没有正确解释。谢谢!