PDA

Просмотр полной версии : Удаление нескольких слушателей


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
Можно попроще.

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
Только делать кастомный EventDispatcher.
В нем переопределять метод addEventListener

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

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

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

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

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;
И в зависимости от ситуации запускать ту или иную функцию.
if(state==0){...
if(state==1){...
if(state==2){...

greenhill
30.12.2010, 13:40
Я бы не заморачивался и удалил все 3.

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
// Добавление слушателей
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);
}

greenhill
30.12.2010, 14:02
А:) Спасибо, dimarik
На самом деле красивый способ!

Добавлено через 6 минут
Только мне не совсем понятно как в этом случае мне добавлять слушатель на определенную ф-цию. Например сейчас мне надо запустить func3

Добавлено через 46 минут
greenhill, hasEventListener то не подойдет?

На сцене две кнопки b и bb
b.addEventListener(MouseEvent.CLICK, f);

function f(e:MouseEvent){
trace(bb.hasEventListener(MouseEvent.CLICK))// false
trace(b.hasEventListener(MouseEvent.CLICK))// true
}

как в случае с тру удалить слушатель, но не указывая ф-ции которую он вызывает?

dimarik
30.12.2010, 15:07
Никак. Кстати, функция и есть слушатель.