在FLASH AS3.0中,为何侦听不到在自定义类的构造函数里发布的自定义事件?

如题,如果把dispatchEvent写在该自定义类的其他函数里面,却可以侦听到?

很简单的告诉你问题所在,并不是构造函数里不能抛出事件,而是你的监听位置有问题。

<发布事件的类myClass>
public class myClass extends EventDispatcher
{
public function myClass() {
dispatchEvent(new Event("hello"));
}
}
<文档类main>
public class main extends Sprite
{
public function main() {
var myclass:myClass=new myClass();
myclass.addEventListener("hello", myFun)
}


以你的这个程序为例,你在addlistener前,已经dispathch了事件,你说如何监听到?
那么,是不是改换一下监听位置就行了呢?比如下面这样:
public function main() {
var myclass:myClass;
myclass.addEventListener("hello", myFun);
//报错,myclass对象在没有构造前无法添加事件监听;
myclass=new myClass();
}

这个一样会报错,因为在一个对象尚未构造前就对它去监听的话是无法实现的,编译器会告诉你目标找不到该属性或方法:
那么,如果你一定要在构造函数里发出事件,并让main监听到又该怎么办呢?看以下这个:

<发布事件的类myClass>
public class myClass extends Sprite
{
public function myClass(m:main) {
main.addChild(this);
//在发出事件前将自己加入main的显示列表
dispatchEvent(new Event("hello"));
}
}
<文档类main>
public class main extends Sprite
{
public function main() {
this.addEventListener("hello",myFun,true);
//先为自己添加监听,一旦自己显示列表中的显示对象发出"hello"事件就可以捕获到该事件。注意,此时的useCapture参数需要置为“true”,因为你抛出的是一个在捕获阶段才能捕获的事件。
var myclass:myClass=new myClass(this);
//把自己当成参数传给myclass,这样myclass就可以将它自己添加到main的显示列表中了。
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-13
监听对象的父子关系你要搞清楚
第2个回答  2011-09-13
能不能把贴几行代码,侦听不到事件,原因很多,谁也不能跟你空口说白话追问

不好意思。。。
主要代码如下:

public class myClass extends EventDispatcher
{
public function myClass() {
dispatchEvent(new Event("hello"));
}
}

public class main extends Sprite
{
public function main() {
var myclass:myClass=new myClass();
myclass.addEventListener("hello", myFun)
}

追答

AS3.0好像遵循谁发送谁侦听的原则, 你可以考虑用一个类专门来发送和侦听事件,参考单例模式,发送事件的为这个类的一个静态属性,它持有这个类的唯一实例.因为它是静态属性,因此它是全局的(只要这个类被载入了内存中),因为即使你做一个AIR程序,其中有几个独立的窗口,也可以通过这种方式来实现窗口间的通信.

package {
import flash.events.EventDispatcher;

public class ControlCenter extends EventDispatcher {
static private var _isClosing:Boolean = false;//实例化开关
static private var _controller:ControlCenter;//类实例
//-------------------获取单例-------------------------
static public function get controller():ControlCenter {
if (ControlCenter._controler == null) {
ControlCenter._isClosing = true;
ControlCenter._controller=new ControlCenter();
ControlCenter._isClosing = false;
}
return ControlCenter._controler;
}

//-------------------获取单例-------------------------
//-------------------构造函数-------------------------
public function ControlCenter() {
if (ControlCenter._isClosing == false) {
throw new Error("ControlCenter:无法实例化");
}
}// constructor code
//-------------------构造函数-------------------------
}//class

}//package
------------------------------------在下面这个类中发送事件---------
package{
public class DispatchHere{
public function DispatchHere(){
ControlCenter.controller.dispatchEvent(new Event("thisIsForOnlyTest"))
}// constructor code
}//class
}//package
----------------------------在下面这个类中接收事件------------------
package{
public class ListenHere{
public function ListenHere(){
ControlCenter.controller.addEventListener("thisIsForOnlyTest",eventHander)
}//constructor cod
private eventHander(e:Event):void{
do sth. here
}
}
}//package

如果还有什么疑问可以追问,会的我尽量回答

第3个回答  2011-09-14
主要代码如下:
<发布事件的类myClass>
public class myClass extends EventDispatcher
{
public function myClass() {
//dispatchEvent(new Event("hello"));
}
public function dis() {
dispatchEvent(new Event("hello"));
}
}
<文档类main>
public class main extends Sprite
{
public function main() {
var myclass:myClass=new myClass();
myclass.addEventListener("hello", myFun)
myclass.dis();
}
相似回答