【发布时间】:2009-07-28 00:29:46
【问题描述】:
独立类之间最简单的通信方式是什么? 找了两天也没找到 有没有办法让一个类有一个dispatchEvent,另一个有一个addEventListener,有一个自定义事件?我只能在具有父子关系的同一个班级中找到解决方案,但我正在寻找的是一种“兄弟”关系可以这么说 谢谢
【问题讨论】:
标签: actionscript-3 event-handling
独立类之间最简单的通信方式是什么? 找了两天也没找到 有没有办法让一个类有一个dispatchEvent,另一个有一个addEventListener,有一个自定义事件?我只能在具有父子关系的同一个班级中找到解决方案,但我正在寻找的是一种“兄弟”关系可以这么说 谢谢
【问题讨论】:
标签: actionscript-3 event-handling
通常,您希望调度事件的类扩展EventDispatcher 或实现IEventDispatcher。 (所有DisplayObjects 都可以,所以如果你的课程是DisplayObjects,你不需要做任何额外的事情。)
在调度类中:
class DispatchingClass extends Event Dispatcher {
function doSomething() {
// do stuff
dispatchEvent(new Event("FOO"));
}
}
在听力课上:
class ListeningClass {
function startListening(dispatcher:DispatchingClass) {
dispatcher.addEventListener("FOO", handleFoo);
}
function handleFoo(evt:Event) {
// do stuff
}
}
EventDispatchers 可以很好地处理自定义事件。
如果由于某种原因您的侦听类没有并且无法获取调度类的实例,您可以创建一个全局事件广播器。基本上,创建一个普遍可访问的类,扩展EventDispatcher(或实现IEventDispatcher)并监听事件并将其分派给任何告诉它的事件。
这是事件广播器的基本实现:
import flash.events.EventDispatcher;
public class EventBroadcaster extends EventDispatcher {
private static var _instance:EventBroadcaster = new EventBroadcaster();
public function EventBroadcaster() {
if (_instance != null) {
trace ("Error: an instance of EventBroadcaster() already exists.");
}
}
public static function getInstance():EventBroadcaster {
return EventBroadcaster._instance;
}
}
你使用它的方式几乎相同:
class DispatchingClass {
function doSomething() {
// do something
EventBroadcaster.getInstance().dispatchEvent(new Event("FOO"));
}
}
class ListeningClass {
function startListening() {
EventBroadcaster.getInstance().addEventListener("FOO", handleFoo);
}
function handleFoo(evt:Event) {
// do stuff
}
}
dispatchEvent() 和addEventListener() 只是内置EventDispatcher 的函数。
Event Broadcaster - Simple events solution... 讨论了制作活动广播器的方法以及如何添加有用的功能。文章Centralized Event Management in Actionscript 2.0对这个概念有很好的介绍。
【讨论】:
所以如果你有 ChildClass1、ChildClass2 和 ParentClass,其中 ChildClass1 和 ChildClass2 都是 ParenClass 的子级。
ChildClass1 将调度一个事件。 ParentClass 将监听此事件,然后它的处理程序将更新 ChildClass2。
【讨论】:
如果您没有 ParentClass,您也可以使用 ChildManagerClass 来注册 Childs 并相应地通知他们。
【讨论】: