AS3将回调函数传递给类构造函数以与addEventListener一起使用

时间:2012-08-15 07:55:57

标签: actionscript-3 callback addeventlistener

这已经困扰了我几天了。我已经写了一个多功能的messageBox类,它运行得很好,但有一件事我坚持下去。首先,这里有一些代码:

在我的文档课程中:

var tMsg:Msg = new Msg("Test Message", "This is a test Message", Msg.INPUT);

tMsg.addEventListener('Answered', qa, false, 0, true);

function qa(e:Event):void{
    trace(e.target.label,e.target.result);
    tLabel.label = e.target.result;
}

单击“取消”或“确定”按钮时,将设置结果属性并调度“已回答”事件。由于这个事件监听器总是需要添加,我认为最好将它包含在类构造函数中;但是,Msg类的每个实例都需要自己的回调,具体取决于结果的用途。此外,应在文档类中声明回调函数。

我认为这可以通过简单地将函数传递给Msg类构造函数来完成,然后使用该引用动态生成addEventListener。 例如:

/// in document class
var tMsg:Msg = new Msg("Test Message", "This is a test Message", Msg.INPUT, qa);

function qa(e:Event):void{
    trace(e.target.label,e.target.result);
    tLabel.label = e.target.result;
}

/// in Msg class
public function Msg(txt:String='', msg:String='', type:String=ALERT, callback:Object=null) {
    _callback = callback;
    addEventListener(Event.ADDED, setup, false, 0, true);
}
private function setup(e:Event){
    stage.addEventListener('Answered', _callback, false, 0, true);
}

这不起作用。我不知道是不是因为我试图存储回调引用(事件监听器应该添加到舞台对象中)还是什么?让它工作的好处是每次创建新消息时都不需要添加事件监听器,只需传递相关的函数。

提前感谢您提供给我的任何帮助。

1 个答案:

答案 0 :(得分:1)

您应该将事件侦听器添加到调度事件的对象。如果该对象不在显示列表中,或者事件没有冒泡,那么舞台将不会收到该事件。