2

これは数日間私を悩ませています。多機能な 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);
}

これはうまくいきません。コールバック リファレンスを保存しようとしているからか (イベント リスナーをステージ オブジェクトに追加する必要があるため)、それとも何なのかわかりません。これを機能させる利点は、新しいメッセージを作成するたびにイベント リスナーを追加する必要がなく、関連する関数を渡すだけでよいことです。

あなたが私に提供できる助けを前もって感謝します。

4

1 に答える 1

2

イベントをディスパッチするオブジェクトにイベント リスナーを追加する必要があります。そのオブジェクトが表示リストにない場合、またはイベントがバブリングしない場合、ステージはイベントを受け取りません。

于 2012-08-15T08:16:06.300 に答える