如何在actionscript中没有继承的类之间监听事件?

时间:2014-04-03 09:50:26

标签: actionscript-3 events

在下面的代码中,事件" myEvent"在A类中调度的内容从未在C类中被监听过。您是否看到了问题所在?

Class A extends EventDispatcher{
    A(){
        dispatchEvent(new Event("myEvent"));
    }
}

Class B extends A{
    ...
}

Class C extends EventDispatcher{
    method(){
        addEventListenet("myEvent", onresult);

        var ob:A = new B();

        ob.method();
    }

    onResult(){
        ...
    }
}

2 个答案:

答案 0 :(得分:1)

问题在于,创建中的A对象不知道调度事件的位置" myEvent",并且调度到self不会做任何事情,因为无处可去要去的事件,即使你告诉它泡沫。您需要为整个A类或类型为A的特定对象提供侦听对象,以便该对象成为dispatchEvent()调用的源,成为目标对于派遣的活动。

class A { // no inheritance needed
    public static var listener:EventDispatcher;
    public function A() {
        if (listener) listener.dispatchEvent("myEvent");
    }
}

另一种可能性是创建一个静态类,仅用于发送broascast事件,实现其功能,就像使用EventDispatcher一样(使用EventDispatcher的内部实例来添加和删除侦听器,发送事件并检查是否有人在听,并使用该课程的界面注册您打算发送给所有听众的任何事件类型。

public class Broadcaster {
    private static var _instance:EventDispatcher=new EventDispatcher();
    public static function addBroadcastListener
      (s:String,f:Function,c:Boolean=false,p:int=0,w:Boolean=false) {
        if (_instance) _instance.addEventListener(s,f,c,p,w);
    }
    // etc, just make wrappers for EventDispatcher functions
}

然后在C.method中执行:

Broadcaster.addBroadcastListener("myEvent",onresult);

在A()中,您可以:

Broadcaster.dispatchEvent(new Event("myEvent"));

答案 1 :(得分:0)

您需要将监听器附加到ob

Class C extends EventDispatcher{
    method(){
        var ob:A = new B();
        ob.addEventListener("myEvent", onresult);
        ob.method();
    }

    onResult(){
        ...
    }
}