事件类型
如果您Event
在 Flash 中使用 an,您可以调度任何命名类型,因为它是一个字符串。所以不管你怎么称呼它,只要听者听的是完全相同的type。这就是它起作用的原因。没有魔法进化。但是,在这种情况下,我会选择使用自定义事件。
自定义事件的工作原理
看看自定义事件的工作原理,这样您也可以了解元数据的来源。
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 等)可以提供代码补全。它基本上是对类可以调度什么样的事件的描述,因此您知道可以使用哪些侦听器。
即使元数据被删除,代码也应该可以工作。
事件元具有 aname
和 a type
。名称应该是类型的确切值。在我们的例子中,它应该是 的值CLOSE_WINDOW
,所以是MyCustomEvent.closeWindow
。类型应该是带有完整包的类名,在我们的示例中,它将是“com.website.events.MyCustomEvent”。
最后,元数据如下所示:
[Event(name="MyCustomEvent.closeWindow", type="com.website.events.MyCustomEvent")]
顺便说一句,我对您的代码有一些提示:
- 我建议使用英文函数名和参数,而不是荷兰文。
verbergAdminComponent
不是一个好名字的处理程序,它应该是类似的handleCloseWindow(event)
,它应该调用verbergAdminComponent
函数。