こんにちは。

コンポーネントが発行するイベントをリスナーに登録する場合、addEventListenerを使う他にMXMLでは

<mx:Canvas creationComplete = "creationCompleteHandler(event)"/>

このようにも記述することもできます。

これをカスタムコンポーネントでもできるようにしてみます。

まず適当なカスタムコンポーネント「CustomComponent.mxml」を作ります。

<?xml version = "1.0" encoding = "utf-8"?>
<mx:Canvas xmlns:mx = "http://www.adobe.com/2006/mxml"
	width = "400"
	height = "300"
	creationComplete = "init();">

	<mx:Script>
		<![CDATA[
			//イベント用定数
			public static const EVENT_10SEC:String = "sec10Event"
			
			private function init():void
			{
				//生成から10秒後にカスタムイベントを発行してみます。
				var t:Timer = new Timer(10000,1);
				t.addEventListener(TimerEvent.TIMER, onTimer);
				t.start();
			}
			
			private function onTimer(evt:TimerEvent):void
			{
				//カスタムイベントを発行します
				dispatchEvent(new Event(CustomComponent.EVENT_10SEC));
			}
		]]>
	</mx:Script>

</mx:Canvas>

このコンポーネントは生成されてから10秒後にカスタムイベントを発行します。とりあえずこれだけならASで

var customComp:CustomComponent = new CustomComponent();
customComp.addEventListener(CustomComponent.EVENT_10SEC, on10Sec);

と書けばイベントを監視できます。

このイベント登録をMXMLから行うには、Metadataタグ内にカスタムイベントを登録します。CustomComponent.mxmlに以下のように<Metadata>を追加します。

<?xml version = "1.0" encoding = "utf-8"?>
<mx:Canvas xmlns:mx = "http://www.adobe.com/2006/mxml"
	width = "400"
	height = "300"
	creationComplete = "init();">

	<mx:Script>
		<![CDATA[
			//イベント用定数
			public static const EVENT_10SEC:String = "sec10Event"
			
			private function init():void
			{
				//生成から10秒後にカスタムイベントを発行してみます。
				var t:Timer = new Timer(10000,1);
				t.addEventListener(TimerEvent.TIMER, onTimer);
				t.start();
			}
			
			private function onTimer(evt:TimerEvent):void
			{
				//カスタムイベントを発行します
				dispatchEvent(new Event(CustomComponent.EVENT_10SEC));
			}
		]]>
	</mx:Script>
	
	<!-- Metadataタグ内にカスタムイベントを記述することで、MXMLコンパイラに認識してもらえます。 -->
	<mx:Metadata>
		[Event(name="sec10Event",type="flash.events.Event")]
	</mx:Metadata>

</mx:Canvas>

こうすることでMXMLコンパイラは「このコンポーネントは"sec10Event"というパラメータを持っている」と認識してくれるので、MXML内でのイベント登録が可能になります。FlexBuilderではコード補完もされるようになります。ちゃんとイベントとして認識されていますね。↓

capture 3.png

このカスタムコンポーネントを生成し、10秒後のイベントをキャッチしたらアラート表示をするようにしてみました。実行結果はこんな感じです

ソースはこちらからDLできます。

HTML5飯