2012-01-29 12 views
0

私は次のようにコードを記述しました。
Event.COMPLETEイベントリスナーを削除できないという問題があり、loadData関数を2回以上呼び出すと、2回以上動作します。私の悪い英語と悪い説明に申し訳ありませんが、私は今日それを修正する必要があり、私は何をすべきかわかりません。
私はコードがかなり明らかだと思います。助けてください!ActionScript 3:anon関数でEventListenerを削除する方法

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."); 
} 
+1

:ドキュメント毎の

ldr.close(); 

? – basvk

+1

私はそれを削除する方法はないと思う。しかし、useWeakListenerのaddEventListenerで 'true'を渡すことができます。ところで、私はそれ以外の方法がない限り、関数を避ける方が良いと思う。 – catholicon

+0

ありがとう。 useWeakListenerが私の問題を解決したようです。ありがとう。 –

答えて

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のようなディスパッチャが完了したら、そのリスナーへの参照が必要です。

+0

おかげで、あなたは私を救った! –

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); 
} 
+0

私はこのような関数を使っていました: 'loadData(s6text8、s6sb8、" data/contents/s6text8.xml ");'。今私はそれをどのように使うことができますか? –

+0

このエラーでは、次の行に '' flash.text型の値の無関係な型変換:TextFieldと無関係の型fl.text:TLFTextField.'があります: 'initText(text_place、ldr.data、scrollbar);' –

+0

ステージ上のテキストフィールドインスタンスを確認します。 TLFTextFieldはText Flowを使用する新しいタイプです。オブジェクトを「クラシック」テキストフィールドに変更し、引き続きflash.text:Textfieldクラスを使用することができます。 –

0

もっと簡単な方法があります。イベントリスナーを削除する代わりに、ローダーを閉じます。あなたはそれプライベートまたはパブリック関数の代わりに、匿名の1つとなっていないのはなぜ

Closes the load operation in progress. Any load operation in progress is immediately terminated. If no URL is currently being streamed, an invalid stream error is thrown.

関連する問題