0

I know is not the best practice, but for this example i must continue with this scheme:

In my timeline i have this:

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

Just a very simple enter key listener. In a class sometimes an action is triggered and I need to simulate the enter key press from the class in the timeline:

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

I know the case is triggered bucause i see the trace msg. But my handler function is not triggered. How can i solve this? In a few words, the only thing i need is to execute a function located in my timeline from an external class.

4

2 回答 2

1

您需要 dispatchEvent 到添加侦听器的对象。
例如,如果您的:
addEventListener(KeyboardEvent.KEY_DOWN,handler);
在主时间轴中,您应该
MovieClip(root).dispatchEvent(new KeyBoardEvent(KeyBoardEvent.KEY_DOWN));
在从另一个 MovieClip 调度或添加到根的对象时编写。

于 2013-03-26T13:04:06.380 回答
0

您的问题是您有设计缺陷,而不是代码问题。你有你想要发生的“事情”。有时,您希望它发生,因为按下了一个键。有时,您出于其他原因希望它发生。

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

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

另一种可能的解决方案更高级一些,那就是创建一个新的EventDispatcher,您提供给您希望能够通信的所有实例。在这个模型中,你的 View 会监听那个 EventDispatcher 上的 DO_SOMETHING 事件,然后做一些事情。此 DO_SOMETHING 将作为键盘事件、您要处理的其他条件或任何可能导致“某事”的未来要求的结果而被调度。

于 2013-03-26T19:15:01.947 回答