Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Удаление нескольких слушателей (http://www.flasher.ru/forum/showthread.php?t=148402)

greenhill 29.12.2010 20:55

Удаление нескольких слушателей
 
Привет всем!
У меня есть одна кнопка, но в зависимости от момента, на клик вешается один из трех, например, слушателей.
Как перед присвоением нового слушателя отменить предыдущий? Так чтоб не указывать ф-цию которую он вызывает, например.

terbooter 29.12.2010 20:58

Только делать кастомный EventDispatcher.
В нем переопределять метод addEventListener

greenhill 29.12.2010 21:02

А он на все слушатели в общем распространяется?
Если у меня есть еще другие кнопки с них слушатели не удалятся?
А можно пример кода?

iflamberg 29.12.2010 21:19

Можно попроще.
Код AS3:

private var handlers:Array=[];
 
... //одно место где добавляются слушатели
  addEventListener (SOME1, handler1); handlers.push ({"action":SOME1, "function":handler1});
  addEventListener (SOME2, handler2); handlers.push ({"action":SOME2, "function":handler2});
...
 
... //другое место где добавляются слушатели, но перед этом чистятся старые
  var cur:*;
  while (cur = handlers.pop()) removeEventListener (cur.action,cur.function);
  //добавим новые
  addEventListener (SOME3, handler3); handlers.push ({"action":SOME3, "function":handler3});
  addEventListener (SOME4, handler4); handlers.push ({"action":SOME4, "function":handler4});
...


Bgg 29.12.2010 22:57

Цитата:

Сообщение от terbooter (Сообщение 960892)
Только делать кастомный EventDispatcher.
В нем переопределять метод addEventListener

Ну вы загнули.

greenhill, hasEventListener то не подойдет?

Psycho Tiger 29.12.2010 23:07

Цитата:

Как перед присвоением нового слушателя отменить предыдущий? Так чтоб не указывать ф-цию которую он вызывает, например.
Я бы не заморачивался и удалил все 3.

dimarik 30.12.2010 00:57

Элегантный способ подписывания и отписывания, кмк =)

Код AS3:

var dispatcher:IEventDispatcher = new URLLoader();
this.configureListeners(dispatcher.addEventListener);
....
this.configureListeners(dispatcher.removeEventListener);
 
/**
 * @private
 */

private function configureListeners(method:Function):void {
        method.call(null, IOErrorEvent.IO_ERROR,                super.dispatchEvent);
        method.call(null, SecurityErrorEvent.SECURITY_ERROR,        super.dispatchEvent);
        method.call(null, ProgressEvent.PROGRESS,                super.dispatchEvent);
        method.call(null, HTTPStatusEvent.HTTP_STATUS,                super.dispatchEvent);
}


TanaTiX 30.12.2010 02:22

Зачем так сильно заморачиваться со всеми этими слушателями? Создать переменную state:int;
И в зависимости от ситуации запускать ту или иную функцию.
Код AS3:

if(state==0){...
if(state==1){...
if(state==2){...


greenhill 30.12.2010 13:40

Цитата:

Я бы не заморачивался и удалил все 3.
Код AS3:

btn.removeEventListener(MouseEvent.CLICK, func1);
btn.removeEventListener(MouseEvent.CLICK, func2);
btn.removeEventListener(MouseEvent.CLICK, func2);
 
btn.addEventListener(MouseEvent.CLICK, func1);

вот так?

Цитата:

Элегантный способ подписывания и отписывания, кмк =)
Не совсем понимаю как это в своем случае написать..

dimarik 30.12.2010 13:51

Код AS3:

// Добавление слушателей
this.configureListeners(btn.addEventListener);
...
// Удаление слушателей
this.configureListeners(btn.removeEventListener);
 
/**
 * @private
 */

private function configureListeners(method:Function):void {
        method.call(null, MouseEvent.CLICK, func1);
        method.call(null, MouseEvent.CLICK, func2);
        method.call(null, MouseEvent.CLICK, func3);
}



Часовой пояс GMT +4, время: 23:23.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.