0

ベストプラクティスではないことはわかっていますが、この例では、このスキームを続行する必要があります。

私のタイムラインにはこれがあります:

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

非常に単純なEnterキーリスナー。クラスでは、アクションがトリガーされることがあり、タイムラインでクラスからのEnterキーの押下をシミュレートする必要があります。

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

トレースメッセージが表示されるため、ケースがトリガーされることはわかっています。しかし、私のハンドラー関数はトリガーされません。どうすればこれを解決できますか?簡単に言うと、必要なのは、タイムラインにある関数を外部クラスから実行することだけです。

4

2 に答える 2

1

リスナーが追加されたオブジェクトにEventをディスパッチする必要があります。
たとえば、:
addEventListener(KeyboardEvent.KEY_DOWN,handler);
がメインタイムラインにある場合は
MovieClip(root).dispatchEvent(new KeyBoardEvent(KeyBoardEvent.KEY_DOWN));
、別のMovieClipからディスパッチするとき、またはルートにオブジェクトを追加するときに書き込む必要があります。

于 2013-03-26T13:04:06.380 に答える
0

あなたの問題は、コードの問題ではなく、設計上の欠陥があることです。起こりたい「何か」があります。キーが押されたために発生したい場合があります。他の理由でそれを発生させたい場合があります。

このように見ると、これがビジネスロジックであり、ビューが決定する必要のある領域ではないことが明らかになりました。「何か」もビューの責任ではない可能性があります。あなたはそれが何であるかを言っていないので、あなたの質問に基づいて本当に知る方法はありません。議論のために、それが適切にビューの責任であると仮定しましょう。

これで、ビューにメソッドを追加するsomething()と、「偽の」イベントを生成するための質問の責任者が、必要な条件に応じてそのメソッドを呼び出すことができるようになります。そのパーティは、KEY_DOWNイベントのステージを監視することが理にかなっている役割を果たしている場合もあれば、そうでない場合もあります。ビューのAPIを簡素化することで、親ビューまたは別のコントローラーが、ビューのロジックに影響を与えることなくこれを処理できるようになります。

もう1つの可能な解決策は、もう少し高度なものです。それは、EventDispatcher通信できるようにしたいすべてのインスタンスに提供する新しいものを作成することです。このモデルでは、ビューはそのEventDispatcherでDO_SOMETHINGイベントをリッスンしてから、何かを実行します。このDO_SOMETHINGは、キーボードイベント、処理する他の条件、または「何か」をもたらす将来の要件の結果としてディスパッチされます。

于 2013-03-26T19:15:01.947 に答える