Flex: удалитьEventListener безопасно? - PullRequest
2 голосов
/ 25 октября 2011

Как вызвать removeEventListener, когда я не знаю функцию, которая является обработчиком события?

Ответы [ 3 ]

1 голос
/ 25 октября 2011

Вы должны создать свою собственную реализацию EventDispatcher.Это печально, но собственный прототип IEventListener не предоставляет много полезных методов.

Существует пример кода, как будет выглядеть эта реализация:

package {
import flash.events.EventDispatcher;
import flash.utils.Dictionary;

/**
 * Advanced Event Dispatcher with a ability to remove all listener by event type
 * @author  Rytis Alekna
 */
public class AdvancedEventDispatcher extends EventDispatcher {

    /** This var holds all references to listeners */
    protected var eventListenersByType : Dictionary = new Dictionary( true );

    /**
     * Call this method to remove all listeners of specified type
     */
    public function removeEventListenersByEventType ( type : String, useCapture : Boolean = false ) : void {

        var key : String = type + ":" + useCapture;

        if ( this.eventListenersByType[ key ] && this.eventListenersByType[ key ].lenght > 0 ) {

            // copy array of event listeners
            var listenersToRemove : Array = this.eventListenersByType[ key ].concat();

            // and clear original 
            this.eventListenersByType[ key ] = [];

            // loop over all listeners
            for ( var i : int = 0; i < listenersToRemove.length; i++ ) {
                this.removeEventListener( type, ( removeEventListenersByEventType[i] as Function ), useCapture );
            }

        }

    }

    /**
     * Override this method to implement listeners registration by type.
     */
    override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void  {

        // register with native method
        super.addEventListener(type, listener, useCapture, priority, useWeakReference);

        // create a key for storage
        var key : String = type + ":" + useCapture;

        // check if it doesn't already exist
        if ( !this.eventListenersByType[ key ] ) {
            this.eventListenersByType[ key ] = [];
        }

        // push listener to our storage
        this.eventListenersByType[ key ].push( listener );

    }

}

}

В противном случаекак вы упомянули, что в вашем случае вам нужно запускать событие только один раз, чем вы можете использовать такую ​​удобную среду, как AS3 Signals (http://johnlindquist.com/2010/01/21/as3-signals-tutorial/)

1 голос
/ 25 октября 2011

Попробуйте это:

obj.addEventListener(MouseEvent.CLICK, function( event :Event ):void
{
     obj.removeEventListener(MouseEvent.CLICK, arguments.callee );
});
0 голосов
/ 25 октября 2011

Если я вас правильно понял, вы хотите удалить все остальные обработчики событий и добавить один свой. Это не возможно, AFAIK. И это очень странное поведение, imho, поскольку ваша цель - иметь только одного слушателя событий - я бы лучше предупредил, чем убрал.

Подумайте об использовании preventDefault, stopPropagation функций или пользовательских классов с необходимой вам логикой (например, что-то с обратными вызовами вместо событий).

...