これは数日間私を悩ませています。多機能な messageBox クラスを作成しましたが、かなりうまく機能しますが、行き詰まっていることが 1 つあります。ただし、最初に、ここにいくつかのコードを示します。
私が持っているドキュメントクラスで:
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;
}
「キャンセル」または「OK」ボタンがクリックされると、result プロパティが設定され、「Answered」イベントが送出されます。このイベント リスナーは常に追加する必要があるため、クラス コンストラクター内に含める方がよいと考えました。ただし、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);
}
これはうまくいきません。コールバック リファレンスを保存しようとしているからか (イベント リスナーをステージ オブジェクトに追加する必要があるため)、それとも何なのかわかりません。これを機能させる利点は、新しいメッセージを作成するたびにイベント リスナーを追加する必要がなく、関連する関数を渡すだけでよいことです。
あなたが私に提供できる助けを前もって感謝します。