Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Flex:安全地移除VentListener?_Actionscript 3_Apache Flex - Fatal编程技术网

Actionscript 3 Flex:安全地移除VentListener?

Actionscript 3 Flex:安全地移除VentListener?,actionscript-3,apache-flex,Actionscript 3,Apache Flex,当我不知道哪个函数是事件处理程序时,如何调用removeEventListener?如果我理解正确,您希望删除所有其他事件处理程序并添加一个您的事件处理程序。这是不可能的,阿飞。我觉得这是非常奇怪的行为,因为你的目标是只有一个事件侦听器——我最好防止而不是清除 考虑使用preventDefault、stopPropagation函数或自定义类与所需的logick(例如,具有回调而非事件的对象)。您应该创建自己的EventDispatcher实现。令人遗憾的是,本机IEventListener原型

当我不知道哪个函数是事件处理程序时,如何调用
removeEventListener

如果我理解正确,您希望删除所有其他事件处理程序并添加一个您的事件处理程序。这是不可能的,阿飞。我觉得这是非常奇怪的行为,因为你的目标是只有一个事件侦听器——我最好防止而不是清除


考虑使用
preventDefault
stopPropagation
函数或自定义类与所需的logick(例如,具有回调而非事件的对象)。

您应该创建自己的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 );

    }

}
包{
导入flash.events.EventDispatcher;
导入flash.utils.Dictionary;
/**
*高级事件调度器,能够按事件类型删除所有侦听器
*@作者Rytis Alekna
*/
公共类AdvancedEventDispatcher扩展了EventDispatcher{
/**此变量保存对侦听器的所有引用*/
受保护的var eventListenersByType:Dictionary=newdictionary(true);
/**
*调用此方法以删除指定类型的所有侦听器
*/
公共函数removeEventListenersByEventType(类型:String,useCapture:Boolean=false):void{
变量键:String=type+“:”+useCapture;
if(this.eventListenersByType[key]&&this.eventListenersByType[key].length>0){
//复制事件侦听器的数组
var listenersToRemove:Array=this.eventListenersByType[key].concat();
//原汁原味
this.eventListenersByType[key]=[];
//循环所有侦听器
for(变量i:int=0;i
}

否则,正如您提到的,在您的案例中,您只需要触发事件一次,就可以使用像AS3信号这样的方便框架(http://johnlindquist.com/2010/01/21/as3-signals-tutorial/)试试这个:

obj.addEventListener(MouseEvent.CLICK, function( event :Event ):void
{
     obj.removeEventListener(MouseEvent.CLICK, arguments.callee );
});

请问你为什么需要这样一个功能?用例是什么?我一次只需要使用一个偶数处理程序,一个月只需要一个。这个事件有很多函数。它就像每分钟一千个端点。这不是一个选项。那么不要使用匿名函数-它们几乎每次都会导致内存泄漏。在当前项目中,我找不到除了使用匿名函数以外的其他方法。。。事实上,这不是一个家,而是相互交换…:|@Yordan Yanakiev您永远不应该使用一致函数永远不。。。。。这是一个非常糟糕的编码实践,并且有很多管理问题。懒惰的编码会给你带来麻烦。这是AS3而不是AS2学习OOP并创建一个可以处理您需求的类。我不同意这样的观点,即没有理由使用匿名函数。很可能OP没有足够的经验在没有管理问题的情况下使用它们,但它们和其他任何东西一样——如果使用得当,它们有自己的位置。有关使用所有类型的函数引用(包括匿名引用)的更多信息,请查看我不确定您为什么要这样做
如果(!this.eventListenersByType[key])
,因为上一行,您正在创建一个annomanous对象的“全新实例”。。所以它不可能已经出现在字典里了。即使您使用相同的
type
useCapture
调用它两次,您也会发现每次都会在其中创建一个新数组。对于这种类型的函数,我建议使用另一种方法,但如果您真的打算这样做,则需要字典上的“For in”循环来查找具有匹配属性的键,并将其推入该键的值中。@worms感谢您的更正。我忘记了对象不是那么原始,而是通过引用传递的。对于本例,最好的方法是将参数序列化为类似“someEventType:false”的字符串,然后将其用作键。。我太喜欢强类型的东西了D