フラッシュ:1つのイベントリスナーで特定のタイプのすべてのイベントをリッスンします
-
02-07-2019 - |
質問
それは生死の問題ではありませんが、これが可能かどうかは疑問です:
1つのタイプのカスタムイベント(FormEvent)から2、3のイベントを取得しました。これらすべてのイベントをリッスンし、イベントタイプに従って処理するFormListenerを取得しました。一度に1つのeventListenerを追加する代わりに、すべてのイベントを一度に追加したいです。
これで、次のようになります:
private function addListeners():void {
addEventListener(FormEvent.SHOW_FORM, formListener);
addEventListener(FormEvent.SEND_FORM, formListener);
addEventListener(FormEvent.CANCEL_FORM, formListener);
}
private function formListener(event:formEvent):void {
switch(event.type){
case "show.form":
// handle show form stuff
break;
case "send.form":
// handle send form stuff
break;
case "cancel.form":
// handle cancel form stuff
break;
}
}
しかし、一度にすべてのイベントを追加する代わりに、次のようなことをしたいです
private function addListeners():void {
addEventListener(FormEvent.*, formListener);
}
このようなことが可能かどうか疑問に思います。私はたくさんのイベントを扱っています:)
解決
とにかくこの場合、本当に必要なイベントリスナーは1つだけです。そのリスナーは、フォームでの変更をリッスンし、変更がイベントリスナー関数で利用できるようになったものに等しいパラメーターが使用されます。紹介しますが、これは擬似的な状況であり、通常はメソッド呼び出しほど単純なものからイベントをディスパッチしないことを覚えておいてください。ディスパッチは暗黙的に行われるため、実際にリッスンする必要はありません。
最初のカスタムイベント
package com.yourDomain.events
{
import flash.events.Event;
public class FormEvent extends Event
{
//Public Properties
public static const CANCEL_FORM:int = "0";
public static const SHOW_FORM:int = "1";
public static const SEND_FORM:int = "2";
public static const STATE_CHANGED:String = "stateChanged";
//Private Properties
private var formState:int;
public function FormEvent(formState:int):void
{
super(STATE_CHANGED);
formState = formState;
}
}
}
したがって、カスタムイベントクラスを作成したばかりで、そのカスタムイベントクラスをディスパッチする擬似フォームクラスで一度行ったように、リスナー関数を介して状態をキャッチできるように設定しました。
コードがどのように見えるのか、どのように実装するのかわからないので、これはすべて架空のものであることに注意してください。重要なのは、イベントをディスパッチするときに、新しい状態を反映するパラメーターを送信する必要があることに注意することです。
package com.yourDomain.ui
{
import flash.events.Event;
import flash.events.EventDispatcher;
import com.yourDomain.events.FormEvent;
public class Form extends EventDispatcher
{
public function Form():void
{
//Anything you want form to do upon instantiation goes here.
}
public function cancelForm():void
{
dispatchEvent(new Event(FormEvent.CANCEL_FORM);
}
public function showForm():void
{
dispatchEvent(new Event(FormEvent.SHOW_FORM);
}
public function sendForm():void
{
dispatchEvent(new Event(FormEvent.SEND_FORM);
}
}
}
最後に、リッスンするドキュメントクラスを作成します。クラスのメソッドを呼び出したときに起動するリスナーを作成するのは論理的ではないことを理解してください。メソッドを呼び出したことは明らかですが、この例では当然です。
package com.yourDomain.ui
{
import com.yourDomain.ui.Form;
import com.yourDomain.events.FormEvent;
//Form is in the same package so we need not import it.
public class MainDocumentClass
{
private var _theForm:Form;
public function MainDocumentClass():void
{
_theForm = new Form();
_theForm.addEventListener(FormEvent.STATE_CHANGED, onFormStateChange, false, 0, true);
/*
The following three method calls each cause the
FormEvent.STATE_CHANGE event to be dispatched.
onFormStateChange is notified and checks what
the last change actually was.
*/
_theForm.cancelForm();
_theForm.showForm();
_theForm.sendForm();
}
private function onFormStateChange(e:FormEvent):void
{
switch(e.formState)
{
case CANCEL_FORM:
trace('The form was canceled');
break;
case SHOW_FORM:
trace('The form was revealed');
break;
case SEND_FORM:
trace('The form was sent');
break;
}
}
}
}
これが参考になり、遅くなり、後でいくつかの修正が必要になることを願っていますが、これはあなた自身のイベントの作り方や物事の仕組みをカスタマイズする方法を理解するのに役立つはずです。
他のヒント
これを直接実行できるルーチンは知りませんが、独自に作成することもできます。ここの構文は完全ではありませんが、最初のパスは次のとおりです。
private function addMultipleEventListeners( evts:Array, callback:function ):void
{
for each( var evt:Event in evts )
{
addEventListener( evt, callback );
}
}
次のようにそのルーチンを呼び出すことができます:
var evts:Array = [ FormEvent.SHOW_FORM, FormEvent.SEND_FORM, FormEvent.CANCEL_FORM ];
addMultipleEventListeners( evts, formListener );