0

我编写了如下代码。
问题是我无法删除Event.COMPLETE事件侦听器,当我调用该loadData函数两次或更多次时,它会工作 2 次或更多次。对不起我的英语不好和更糟糕的解释,但我今天需要修复它,我不知道该怎么做。
我认为代码很明显。请帮忙!

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 回答