0

私は次のようにコードを書きました。問題は、イベントリスナーを
削除できず、関数を2回以上呼び出すと、2回以上機能することです。私の悪い英語と悪い説明で申し訳ありませんが、今日それを修正する必要があり、何をすべきかわかりません. コードはかなりわかりやすいと思います。助けてください!Event.COMPLETEloadData

var ldr:URLLoader = new URLLoader();

function loadData(text_place, scrollbar, fileURL:String):void {
    text_place.wordWrap = true;
    var f:TextFormat = new TextFormat();
    f.align = TextFormatAlign.RIGHT;
    text_place.setTextFormat(f);
    ldr.dataFormat = URLLoaderDataFormat.TEXT;
    ldr.load(new URLRequest(fileURL));
    ldr.addEventListener(Event.COMPLETE, function ldr_complete(evt:Event){ 
        initText(text_place, ldr.data, scrollbar);
    });
    ldr.addEventListener(IOErrorEvent.IO_ERROR, loadError);
}

function initText(text_place:TLFTextField, fileContent, scrollbar):void {
    ldr.removeEventListener(IOErrorEvent.IO_ERROR, loadError);
    text_place.htmlText = "";
    text_place.tlfMarkup = fileContent;
    scrollbar.update();
    trace("Data loaded");
}

function loadError(e:IOErrorEvent):void {
    trace("Error loading an external file.");
}
4

3 に答える 3

3

関数の囲いを書くことを避け、完全な関数の渡された引数のスコープを拡張して、それらにアクセスできるようにします。

var ldr:URLLoader = new URLLoader();
var text_place:TextField;
var scrollbar:Object; //or whatever it is

function loadData(text_place, scrollbar, fileURL:String):void
{
    var f:TextFormat = new TextFormat();
    f.align = TextFormatAlign.RIGHT;

    text_place.wordWrap = true;
    text_place.setTextFormat(f);

    scrollbar = scrollbar;

    ldr.dataFormat = URLLoaderDataFormat.TEXT;
    ldr.load(new URLRequest(fileURL));

    ldr.addEventListener(IOErrorEvent.IO_ERROR, loadError);
    ldr.addEventListener(Event.COMPLETE, loadComplete);
}

function initText(text_place:TLFTextField, fileContent, scrollbar):void
{
    removeLoaderEventListeners();

    text_place.htmlText = "";
    text_place.tlfMarkup = fileContent;

    scrollbar.update();

    trace("Data loaded");
}

function loadError(e:IOErrorEvent):void
{
    removeLoaderEventListeners();

    trace("Error loading an external file.");
}

function loadComplete(evt:Event):void
{
    removeLoaderEventListeners();

    initText(text_place, ldr.data, scrollbar);
}

function removeLoaderEventListeners():void
{ 
    ldr.removeEventListener(IOErrorEvent.IO_ERROR, loadError);
    ldr.removeEventListener(Event.COMPLETE, loadComplete);
}
于 2012-01-29T16:56:08.793 に答える
1

トリガーされた後にイベントのリッスンを停止する場合は、匿名リスナー自体の登録を解除できます。

ldr.addEventListener(Event.COMPLETE, function(event:Event):void
{
     event.target.removeEventListener(event.type, arguments.callee);
     // ... do whatever you need to do here
});

ただし、リスナーなどの完了時に同じディスパッチャーからの他のイベントのリッスンも停止したい場合は、IOErrorEvent.IO_ERRORそのリスナーへの参照を削除して削除する必要があります。

于 2012-01-29T18:37:33.910 に答える
0

もっと簡単な方法があります。イベントリスナーを削除する代わりに、ローダーを閉じます。

ldr.close();

ドキュメントによると:

進行中のロード操作を閉じます。進行中のロード操作は直ちに終了します。現在ストリーミングされているURLがない場合、無効なストリームエラーがスローされます。

于 2012-06-14T14:44:14.683 に答える