PD2:
this line should be removed from the unregisterEventListener()
_dispatcher.removeEventListener(type, listener, useCapture);
since it will cause an infinite loop and the eventListener has already been
removed in the caller anyway.
So, to sum up:
public function unregisterEventListener(type:String, listener:Function,
useCapture:Boolean):void {
var i:int = _eventsList.length - 1;
var cur:EventListenerData;
while (i >= 0) {
cur = _eventsList[i] as EventListenerData;
if (cur.type == type && cur.listener == listener && cur.useCapture ==
useCapture) {
// _dispatcher.removeEventListener(type, listener, useCapture);
_eventsList.splice(i, 1);
}
i--;
}
}
Cheers
Juan Pablo Califano
2008/7/20, Juan Pablo Califano <[EMAIL PROTECTED]>:
>
> PD:
>
> I forgot to actually remove the eventListenerData from the list in the
> unregisterEventListener method of the Bookkeeper class. Looping backwards
> and adding _eventsList.splice(i, 1); should do it.
>
>
> Cheers
> Juan Pablo Califano
>
>
>
> 2008/7/20, Juan Pablo Califano <[EMAIL PROTECTED]>:
>>
>> Hi,
>>
>> You could try to do your own bookkeeping, so you know what listeners are
>> registered to an EventDispatcher object. You can have one class to hold that
>> info in a list and write a method that loops through that list and remove
>> all registered listeners. You'd still have to override the addEventListener
>> and removeEventListener methods in the dispatcher object, to intercept those
>> calls from external code and keep your bookkeeper in sync.
>>
>> Some code to illustrate it (keep mind that even though it compiles, this
>> is untested and may be not the best idea).
>>
>> package
>> {
>> import flash.display.Sprite;
>>
>> public class Main extends Sprite
>> {
>> private var _evtBookKeeper:EventBookkeeper;
>>
>> public function Main():void
>> {
>> _evtBookKeeper = new EventBookkeeper(this);
>> }
>>
>> override public function addEventListener(type:String,
>> listener:Function, useCapture:Boolean = false, priority:int = 0,
>> useWeakReference:Boolean = false):void
>> {
>> super.addEventListener(type, listener, useCapture, priority,
>> useWeakReference);
>> _evtBookKeeper.registerEventListener(type, listener, useCapture);
>> }
>>
>> override public function removeEventListener(type:String,
>> listener:Function, useCapture:Boolean = false):void
>> {
>> super.removeEventListener(type, listener, useCapture);
>> _evtBookKeeper.unregisterEventListener(type, listener, useCapture);
>> }
>>
>> public function removeAllListeners():void {
>> _evtBookKeeper.unregisterAndRemoveAll();
>> }
>>
>> }
>> }
>>
>> //
>> //
>> //
>>
>> package
>> {
>> import flash.events.IEventDispatcher;
>> import flash.utils.Dictionary;
>>
>> public class EventBookkeeper
>> {
>>
>> private var _eventsList:Array;
>> private var _dispatcher:IEventDispatcher;
>>
>> public function EventBookkeeper(dispatcher:IEventDispatcher) {
>> _eventsList = [];
>> }
>>
>> public function registerEventListener(type:String, listener:Function,
>> useCapture:Boolean):void {
>> _eventsList.push(new EventListenerData(type,listener,useCapture));
>> }
>>
>> public function unregisterEventListener(type:String, listener:Function,
>> useCapture:Boolean):void {
>> var len:int = _eventsList.length;
>> var i:int = 0;
>>
>> var cur:EventListenerData;
>>
>> while (i < len) {
>> cur = _eventsList[i] as EventListenerData;
>> if (cur.type == type && cur.listener == listener && cur.useCapture ==
>> useCapture) {
>> _dispatcher.removeEventListener(type, listener, useCapture);
>> }
>> i++;
>> }
>> }
>>
>> public function unregisterAndRemoveAll():void {
>> var len:int = _eventsList.length;
>> var i:int = 0;
>>
>> var cur:EventListenerData;
>>
>> while (i < len) {
>> cur = _eventsList[i] as EventListenerData;
>> _dispatcher.removeEventListener(cur.type, cur.listener,
>> cur.useCapture);
>> i++;
>> }
>>
>> _eventsList = [];
>>
>> }
>> }
>>
>> }
>>
>> //
>> //
>> //
>>
>> package
>> {
>>
>> public class EventListenerData
>> {
>>
>> public var type:String;
>> public var listener:Function;
>> public var useCapture:Boolean;
>>
>> public function
>> EventListenerData(type:String,listener:Function,useCapture:Boolean) {
>> this.type = type;
>> this.listener = listener;
>> this.useCapture = useCapture;
>> }
>>
>> }
>>
>> }
>>
>>
>> 2008/7/18, Fabio Pinatti <[EMAIL PROTECTED]>:
>>>
>>> Hi list,
>>>
>>> I'm wondering if I can have a generical function, that I can remove all
>>> listeners registered for an object. Imagine a button with 10 listeners,
>>> and
>>> I don`t need know which ones it are to remove. I simply call
>>> "removeListeners(dpo)" and that function does all work.
>>>
>>> Is there any way?
>>>
>>> Thanks so much,
>>>
>>> --
>>> Fábio Pinatti
>>> :: web.developer
>>> :::: www.pinatti.com.br
>>> :::::: 19. 9184.3745 / 3342.1130
>>> _______________________________________________
>>> Flashcoders mailing list
>>> [email protected]
>>> http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
>>>
>>
>>
>
_______________________________________________
Flashcoders mailing list
[email protected]
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders