Actionscript 3 在AS3中发送事件时,适当的形式是什么?
我想知道创建自定义事件时的适当形式是什么?应该创建一个CustomEvent类,然后在函数中创建一个临时分派器,并分派CustomEvent。还是最好尝试创建CustomEventDispatcher类,并将CustomEvent类创建为该类的内部类,例如:Actionscript 3 在AS3中发送事件时,适当的形式是什么?,actionscript-3,events,coding-style,event-dispatching,Actionscript 3,Events,Coding Style,Event Dispatching,我想知道创建自定义事件时的适当形式是什么?应该创建一个CustomEvent类,然后在函数中创建一个临时分派器,并分派CustomEvent。还是最好尝试创建CustomEventDispatcher类,并将CustomEvent类创建为该类的内部类,例如: package { public class CustomEventDispatcher extends EventDispatcher { public function CustomEventDispatcher
package
{
public class CustomEventDispatcher extends EventDispatcher
{
public function CustomEventDispatcher()
{
super(new CustomEvent());
}
}
}
class CustomEvent
{
public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable)
}
}
单方面而言,最好是让公众能够访问事件。通过这种方式,您可以键入侦听器(有利于代码提示和调试),并使事件具有公共静态常量类型(您可能也希望查看这些类型)。不要忘记覆盖克隆。重写toString进行调试也是一个好主意 下面是我的一个自定义事件的示例:
package com.mattie.events
{
//Imports
import flash.events.Event;
//Class
public class SearchFieldEvent extends Event
{
//Constants
public static const SEARCH_COMPLETE:String = "search complete";
//Variables
public var totalResults:uint;
public var duration:uint;
public var searchText:String;
//Constructor
public function SearchFieldEvent(type:String, totalResults:uint = 0, duration:uint = 0, searchText:String = "")
{
super(type);
this.totalResults = totalResults;
this.duration = duration;
this.searchText = searchText;
}
//Override clone
public override function clone():Event
{
return new SearchFieldEvent(type, totalResults, duration, searchText);
}
//Override toString
public override function toString():String
{
return formatToString("SearchFieldEvent", "type", "totalResults", "duration", "searchText");
}
}
}
在构思事件机制时,有两个基本问题需要回答 1) 如何为我的事件创建dispatcher实例 常规选项有:扩展EventDispatcher或聚合dispatcher实例 最基本和最常见的实践(官方文档也说明了这一点)是扩展EventDispatcher类,从而为类提供事件调度功能 优点:易于实现——只需键入extensedeventdispatcher,您就完成了 缺点:您不能扩展其他内容。显然,这就是为什么许多本机类都是EventDispatcher的孙子。我想只是为了省去我们的麻烦 第二种通用方法是聚合调度程序实例
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
public class ClassA implements IEventDispatcher
{
private var dispatcher:EventDispatcher;
public function ClassA()
{
initialize();
}
private function initialize():void
{
dispatcher = new EventDispatcher(this);
}
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
{
dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
}
public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
{
dispatcher.removeEventListener(type, listener, useCapture);
}
public function dispatchEvent(event:Event):Boolean
{
return dispatcher.dispatchEvent(event);
}
public function hasEventListener(type:String):Boolean
{
return dispatcher.hasEventListener(type);
}
public function willTrigger(type:String):Boolean
{
return dispatcher.willTrigger(type);
}
}
}
注意:我们将对聚合类的引用传递给dispatcher构造函数。
这样做是为了使event.target引用您的类实例,而不是dispatcher实例本身
优点:您可以自由扩展您喜欢的内容。您可以使用dispatcher钩子执行一些技巧,例如维护侦听器列表或类似的操作
缺点:没有第一种方法那么简单
2) 如何通过事件传递自定义数据
常规选项有:在事件实例中传递数据,或仅使用事件处理程序中的event.target引用从源访问某些数据
若您选择通过event.target访问所有必要的数据——不需要额外的工作,只需将事件处理程序中的此引用强制转换为相应的类
如果您想随事件一起传递一些数据,您可以将event子类化,并且这个类应该对处理事件的代码公开可见,正如上面的答案所述。AS3是关于严格和强大的打字,那么你为什么要抵制它呢
仅当要重新修补已处理的事件时,才需要重写事件子类中的clone()方法。官方文档说,为了安全起见,每次创建自定义事件类时都必须这样做。所有这些都是很好的答案,但这里的清晰和相对全面的回答是我最喜欢的。再加上简单的赞成-反对方法也没什么坏处。非常感谢你。另外,您是否在构造函数中使用私有函数调用来实现JIT优化?嗯,我总是在单独的函数中进行初始化。这并不是说编译器没有优化构造函数代码:它使您的代码更加灵活,因为您可以推迟调用init方法。