ActionScript 3: как удалить EventListener с помощью функций anon
Я написал код следующим образом.
Проблема в том, что я не могу удалить 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 ответа
Если вы хотите прекратить прослушивание события после его запуска, вы можете отменить регистрацию анонимного прослушивателя в себе:
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
слушатель, вам все еще нужна ссылка на этого слушателя, чтобы удалить его.
Просто избегайте написания вложенных функций и расширяйте область действия переданных аргументов полной функции, чтобы они могли получить к ним доступ.
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);
}
Есть более простой способ. Вместо удаления слушателей событий закройте загрузчик.
ldr.close();
Согласно документации:
Закрывает операцию загрузки в процессе. Любая выполняемая операция загрузки немедленно прекращается. Если в данный момент не передается ни один URL, выдается неверная ошибка потока.