ActionScript 3: как удалить EventListener с помощью функций anon - PullRequest
0 голосов
/ 29 января 2012

Я написал код следующим образом.
Проблема в том, что я не могу удалить 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.");
}

Ответы [ 3 ]

3 голосов
/ 29 января 2012

просто избегайте написания вложенных функций и расширяйте область действия переданных аргументов полной функции, чтобы они могли получить к ним доступ.

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);
}
1 голос
/ 29 января 2012

Если вы хотите прекратить прослушивание события после его запуска, вы можете отменить регистрацию самого анонимного прослушивателя:

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 голосов
/ 14 июня 2012

Есть более простой способ. Вместо удаления прослушивателей событий закройте загрузчик.

ldr.close();

Согласно документации:

Закрывает текущую операцию загрузки. Выполняется любая операция загрузки немедленно прекращается. Если ни один URL в настоящее время не транслируется, выдана неверная ошибка потока.

...