从类到时间轴的dispatchEvent

时间:2013-03-26 12:49:01

标签: actionscript-3 flash

我知道这不是最好的做法,但对于这个例子,我必须继续这个方案:

在我的时间表中,我有这个:

 addEventListener(KeyboardEvent.KEY_DOWN,handler);
function handler(event:KeyboardEvent){
   if(event.charCode == 13){
       trace('enter pressed');
   }
}

只是一个非常简单的输入键监听器。在课堂上有时会触发一个动作,我需要在时间轴中模拟来自班级的回车键:

case 'enter':
{
  trace('it works!');
  dispatchEvent(new KeyBoardEvent(KeyBoardEvent.ENTER));    
  return;
}

我知道这个案例被触发了,因为我看到了跟踪消息。但我的处理程序功能未被触发。我怎么解决这个问题?简而言之,我唯一需要的是从外部类执行位于我的时间轴中的函数。

2 个答案:

答案 0 :(得分:1)

你需要将dispatchEvent转移到添加了监听器的对象 例如,如果您的:addEventListener(KeyboardEvent.KEY_DOWN,handler);
在主时间轴中,则应在从另一个MovieClip发送或添加到根目录时写入MovieClip(root).dispatchEvent(new KeyBoardEvent(KeyBoardEvent.KEY_DOWN));
点。

答案 1 :(得分:0)

您的问题是您有设计缺陷,而不是代码问题。你有"东西"你想要发生。有时,您希望它发生,因为按下了一个键。有时你会因为其他原因而希望它发生。

当你这样看时,现在显而易见的是,这是业务逻辑,在View应该决定的事物领域。有可能"某事"也不是View的责任。你还没有说出它是什么,所以根据你的问题没有办法真正知道。让我们假设它是适当的View责任。

现在,如果您向自己的视图添加something()方法,那么您的问题中负责生成"假冒"事件现在可以调用该方法以响应您需要它的任何条件。该方可能处于一个角色,在该角色中,它可以观看KEY_DOWN事件的舞台,或者它可能没有。通过简化View上的API,您可以使父视图或单独的Controller处理此问题,而不会影响视图中的逻辑。

另一种可能的解决方案是更高级,即创建一个新的EventDispatcher,您可以为要通信的所有实例提供这种新的{{1}}。在此模型中,您的View将在该EventDispatcher上侦听DO_SOMETHING事件,然后执行某些操作。这个DO_SOMETHING将由于键盘事件,您想要处理的其他条件或任何将导致某些事情的未来要求而被调度。"