2

这几天一直困扰着我。我写了一个多功能的 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);
}

这行不通。我不知道是不是因为我正在尝试存储回调引用(应该将事件侦听器添加到舞台对象)还是什么?让它工作的好处是我不必每次创建新消息时都添加事件侦听器,只需传递关联的函数即可。

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

4

1 回答 1

2

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

于 2012-08-15T08:16:06.300 回答