【问题标题】:Flash AS3. Problems with removing EventListener闪存 AS3。删除 EventListener 的问题
【发布时间】:2014-05-18 23:58:13
【问题描述】:

所以我这里有点问题。我将在我将展示的代码中使用假变量名以使其更简单。但是,我创建了一个函数,它被某些不重要的条件调用一次。这个函数创建一个变量,它本身就是一个函数。然后,我为此函数变量调用计时器 eventListener 以在“循环”中调用它。它适用于那部分。但是,我想删除此事件侦听器,但它无法识别此计时器函数中的函数变量(我作为参数发送)。它显示为 null,这意味着我无法删除 eventListener 并且该函数会一直被调用。有什么解决办法吗?

附: myTimer 是一个随处可用的公共变量,我收到 1010 错误。

public function calledOnce(){
    this.myFunction = loopFunction( x, y, "function" );
    this.myTimer.addEventListener( TimerEvent.TIMER, this.myFunction );
}
public function loopFunction( refX, refY, refFunction ){
    return function( e: Event ){
        //Do something
        switch( refFunction ){
            case "function":
                this.myTimer.removeEventListener( TimerEvent.TIMER, this.myFunction );
                break;
        }
    };
}

【问题讨论】:

  • 有趣的是,我不得不实际复制并粘贴它,因为我认为它确实可以工作。也许有人可以解释一下。但是,如果这不起作用,那么以这种方式制作它有什么需要呢?你不能只是改变你的代码不返回一个函数吗?对此表示赞同,因为我也对解释感到好奇。

标签: actionscript-3 flash function events


【解决方案1】:

我相信这与this 有关。如果你trace (this); 你会得到[object YourClass] 但是当你在函数内部这样做时:

public function loopFunction( refX, refY, refFunction ){
    return function( e: Event ){
        trace (this);
        //Do something
        switch( refFunction ){
            case "function":
                myTimer.removeEventListener( TimerEvent.TIMER, myFunction );
                break;
        }
    };
}

你得到的是[global],我感觉你的类对象不再存在于那个范围内。我设法通过摆脱 this 并明确声明变量来使其运行:

private var myFunction:Function;
private var myTimer:Timer = new Timer (1000);

public function calledOnce(){
    myFunction = loopFunction( x, y, "function" );
    myTimer.addEventListener( TimerEvent.TIMER, this.myFunction );
}
public function loopFunction( refX, refY, refFunction ){
    return function( e: Event ){
        //Do something
        switch( refFunction ){
            case "function":
                myTimer.removeEventListener( TimerEvent.TIMER, myFunction );
                break;
        }
    };
}

【讨论】:

    【解决方案2】:

    您需要返回一个现成的函数代码,不要引用那些refX, refY, refFunction,因为它们在生成的函数中不可用。

    public function loopFunction( refX, refY, refFunction ){
        switch( refFunction ){
            case "function":
                return function( e: Event ){
                    //Do something
                    myTimer.removeEventListener( TimerEvent.TIMER, myFunction );
                }
            }
        }
    }
    

    请注意,尽管删除动态生成的侦听器并不容易,但要做到这一点,您首先必须将函数存储在某个地方(您已经有代码将其存储在变量 myFunction 中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 2023-03-14
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多