イベントの種類
Flashでinを使用する場合Event
、それは文字列であるため、任意の名前付き型をディスパッチできます。したがって、リスナーがまったく同じタイプをリッスンしている限り、どのように呼び出すかは問題ではありません。それが機能する理由です。進化した魔法はありません。ただし、その場合はカスタムイベントを使用することにします。
カスタムイベントの仕組み
カスタムイベントの動作を見て、メタデータがどこから来るのかも理解してください。
package com.website.events
{
import flash.events.Event;
/**
* @author ExampleUser
*/
public class MyCustomEvent extends Event
{
/**
*
*/
public static const CLOSE_WINDOW:String = "MyCustomEvent.closeWindow";
public function MyCustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false):void
{
super(type, bubbles, cancelable);
}
override public function clone():Event
{
return new MyCustomEvent(this.type, this.bubbles, this.cancelable);
}
override public function toString():String
{
return formatToString("MyCustomEvent", "type", "bubbles", "cancelable", "eventPhase");
}
}
}
私は(あなたの例のように)直接文字列の代わりに静的定数を使用するので、より厳密に入力されます。
actionscriptでは、このようなカスタムイベントをディスパッチします。Windowという名前のクラスを作成するとします。
package com.website.ui
{
/**
* @eventType com.website.events.MyCustomEvent.closeWindow
*/
[Event(name="MyCustomEvent.closeWindow", type="com.website.events.MyCustomEvent")]
import flash.display.Sprite;
import flash.events.MouseEvent;
import com.website.events.MyCustomEvent;
/**
* @author ExampleUser
*/
public class Window extends Sprite
{
public var mcCloseButton:Sprite;
public function Window():void
{
this.mcCloseButton.addEventListener(MouseEvent.CLICK, handleCloseButtonClick);
}
private function handleCloseButtonClick(event:MouseEvent):void
{
this.dispatchEvent(new MyCustomEvent(MyCustomEvent.CLOSE_WINDOW));
}
}
}
これは、メタデータを配置する必要があるクラスです。このクラスはイベントをディスパッチしています。同じイベントをディスパッチする他のクラスにも、メタデータが含まれている可能性があります。
そのため、ユーザーが閉じるボタンをクリックすると、Windowはタイプ付きのイベントをディスパッチします。CLOSE_WINDOW
別のファイルでは、それを聞いて何かをします。
package com.website
{
import flash.display.Sprite;
import com.website.events.MyCustomEvent;
import com.website.ui.Window;
/**
* @author ExampleUser
*/
public class Main extends Sprite
{
private var _window:Window;
public function Main():void
{
this._window:Window = new Window();
// a smart code-editor would give you a hint about the possible events when you typed "addEventListener"
this._window.addEventListener(MyCustomEvent.CLOSE_WINDOW, handleWindowClosed);
this.addChild(this._window);
}
private function handleWindowClosed(event:MyCustomEvent):void
{
// do something
this._window.visible = false;
}
}
}
これは機能するはずです。もちろん、実際の状況では。MyCustomEvent
という名前になりWindowEvent
ます。
イベントメタデータ
メタデータを使用してコンパイラーにヒントを与えることができ、現在ではスマートコードエディター(FDT、FlashDevelop、FlashBuilder、IntelliJなど)がコードを完成させることができます。これは基本的に、クラスによってディスパッチされる可能性のあるイベントの種類の説明であるため、どのリスナーを使用できるかがわかります。
メタデータが削除された場合でも、コードは機能するはずです。
イベントメタにはとがname
ありtype
ます。名前は、タイプの正確な値である必要があります。この例の場合、それはの値である必要があるCLOSE_WINDOW
ので、それはMyCustomEvent.closeWindow
です。タイプは完全なパッケージのクラス名である必要があります。この例の場合は、「com.website.events.MyCustomEvent」になります。
最後に、メタデータは次のようになります。
[Event(name="MyCustomEvent.closeWindow", type="com.website.events.MyCustomEvent")]
ところで、私はあなたのコードについていくつかのヒントがあります:
- オランダ語ではなく、英語の関数名とパラメーターを使用することをお勧めします。
verbergAdminComponent
ハンドラーの名前としては適切ではありません。関数handleCloseWindow(event)
を呼び出す、のような名前にする必要がありverbergAdminComponent
ます。