進行度D
Event map
Event MapはMateの中心となる概念です。Event Map(または複数のEvent Map)では、イベントが送出されたときにどのような処理をするのかを定義します。それぞれのイベントタイプがイベントマップ内に専用のEventHandlersブロックを持ちます。
<EventMap xmlns="http://mate.asfusion.com/"> ...event handlers blocks here... </EventMap>
原則的にEventMapは1つのMXMLファイルで、Applicationファイルに配置されます。Flexにおけるコンポーネント生成サイクルに従うにはそうする必要があるからです。仮にイベントマップをアプリケーションの深い階層に配置したとしたら、生成が遅すぎてすべてのイベントを受け取れません。Applicationファイルに配置することで、Flexが起動プロセスの早い段階で送出するFlexEvent.PREINITIALIXEイベントなどを受け取ることができます。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:maps="com.yourdomain.maps.*"> <maps:MyEventMap /> ...other application components here... </mx:Application>
Event Handlers
Event Mapに定義されたEvent HandlersブロックはEventHandlersタグのtype属性に指定されたイベントタイプが送出された時に実行されます。ハンドラがイベントを受け取るためには、バブリング可能なイベントをApplicationの子孫であるオブジェクトから送出するか、Mate Dispatcherからイベントを送出しなければなりません(ポップアップウィンドウから送出する場合など)。
イベントハンドラブロックを定義するにはEventHandlersタグを使用します。
<EventHandlers type="myEventType"> ... here what you want to happen when this event is dispatched... </EventHandlers>
先に述べたように、一連のイベントハンドラはイベントマップに配置します。
<EventMap xmlns="http://mate.asfusion.com/">
<EventHandlers type="myEventType">
... here what you want to happen when this event is dispatched...
</EventHandlers>
<EventHandlers type="myOtherEventType">
... here what you want to happen when this other event is dispatched...
</EventHandlers>
</EventMap>
EventHandlersタグの内部では、イベントが送出された際に呼び出したいすべてのハンドラを配置します。
例えば、実行したい一連のハンドラがありイベントタイプ"myEventType"を送出する場合を見てみましょう。ボタンがクリックされたときにイベントを送出します(イベントのbubbleプロパティがtrueになっていることに注意してください):
private function buttonClicked():void {
var event:MyCustomEvent = new MyCustomEvent("myEventType", true);
dispatchEvent(event);
}
この例では、MyCustomEventというカスタムイベントクラスを作成済みであることが前提となっています。ボタンがクリックされるとbuttonClicked()メソッドが実行され、最初のハンドラリストがイベントを受信し、そのハンドラリストが持っているハンドラを実行していきます。
指定できるハンドラは複数あり、それぞれ異なる目的で使用されます。
- MethodInvoker
- CommandInvoker
- EventAnnouncer
- WebServiceInvoker?
- HTTPServiceInvoker
- RemoteObjectInvoker?
- ObjectBuilder
- DataCopier
- StopHandlers
- InlineInvoker
- ResponseAnnouncer
Method Invoker
MethodInvokerは最も良く使用されるタグの1つです。EventHandlersタグの内部に配置されそのハンドラリストが実行されると、"generator"属性に指定されたクラスを生成、"method"属性に指定された関数を呼び出します。関数の引数には様々なソースから受け渡すことができます。受け取ったイベント自身や、サーバの結果オブジェクトなどです。
<MethodInvoker
generator="ClassNameToInstantiate"
method="methodToExecute"
arguments="{['argument1', 'argument2']}"/>
上記の例をActionScriptコードで書くと次のようになります:
var myWorker:ClassNameToInstantiate = new ClassNameToInstantiate();
myWorker.methodToExecute('argument1', 'argument2');
属性の指定の仕方は他にもありますし、使用できる属性も他にあります。使用方法はドキュメントを参照してください。
Command Invoker
CommandInvokerタグはMethodInvokerタグと非常に良く似ていますが制限があり、生成するジェネレータクラスしか指定できません。常に"execute"メソッドを呼び出し、ただ1つの引数として受け取ったイベントを渡します。このタグはCairngormのコマンドを再利用するときに有用です。
<CommandInvoker generator="CommandClassNameToInstantiate" />
Event Announcer
イベントハンドラブロックの内部で他のイベントをトリガしたい場合はEventAnnouncerタグを使用します。
<EventAnnouncer type="myEventType" generator="EventClassNameToInstantiate" />
新しく生成したイベントにプロパティを与えることもできます。
<EventAnnouncer type="myEventType" generator="MyEventClass"> <Properties myProperty="myValue" myProperty2="other value"/> </EventAnnouncer>
MethodInvokerの引数の場合は、生成したイベントのプロパティは元のイベント、サーバの結果、その他のソースから渡すことができます。
上記の例をActionScriptコードで書くと次のようになります:
var myEvent:MyEventClass = new MyEventClass("myEventType", true);
myEvent.myProperty = "myValue";
myEvent.myProperty2 = "other value";
dispatchEvent(myEvent);
EventAnnouncerタグを使用した時との主な違いは、それを含むイベントハンドラリストが実行されたときに必ずイベントが送出されることと、リスト内の実行順序を指定できることです。
Service Calls
HTTPServiceInvokerタグ、WebServiceInvoker?タグ、RemoteObjectInvoker?タグを使用して異なるタイプのサービスを呼び出すことができます。もしサービスをすでに生成していたとしたら(HttpService、WebService、RemoteObject)、"instance"属性に指定することができ、イベントマップ内でサービスのプロパティを指定する必要がなくなります。このようにして、使用するサービスを別のファイルに定義することができます。
サービスインボーカタグ(HTTPServiceInvoker、WebServiceInvoker?、RemoteObjectInvoker?)を使用することでイベントマップ内にインラインで記述することもできます。
<WebServiceInvoker instance="{myServiceInstance}" method="serverMethodToCall" arguments="{['argument1', 'argument2']}" />
翻訳用注釈:以下WebService Invokerの項まで、ここの冒頭に全く同じ記述あり
サービスが呼び出されると2種類のレスポンスを取得することができます。1つはサービスが返した内容を持つ結果。もう1つはサーバ接続時のエラーまたはサーバから返されたエラーです。これらのレスポンスが非同期に受信されることに注意してください。つまりサーバへのリクエストが送信された後、いつレスポンスが返されるかを知ることはできません。
EventHandlersまたはMessageHandlers?の内部でサービスタグ(RemoteObjectInvoker?、WebServiceInvoker?、HTTPServiceInvoker
)を使用し、イベントの送出またはメッセージの受信が行われたとき、サーバへのリクエストが行われ一連のハンドラの実行が続行されます。サービスタグより後に配置されたハンドラはサーバヘのリクエストが行われた後に実行されますが、そのリクエストに対するサーバからのレスポンスがあるまで待機したい場合はどうすればよいのでしょう?サービスインボーカタグの内部では、サーバからの応答またはエラー応答があった場合に実行されるハンドラを配置することができます。
<WebServiceInvoker instance="{myServiceInstance}" ...>
<resultHandlers>
... this list executes when server returns results ...
</resultHandlers>
</WebServiceInvoker>
同様に、リクエストがエラーになってしまった場合も、その時に実行されるハンドラを配置することができます。
<WebServiceInvoker instance="{myServiceInstance}" ...>
<faultHandlers>
... this list executes when server returns a fault ...
</faultHandlers>
</WebServiceInvoker>
もちろん1つのサービスタグに両方のハンドラを定義することもできます:
<WebServiceInvoker instance="{myServiceInstance}" ...>
<resultHandlers>
... this list executes when server returns results ...
</resultHandlers>
<faultHandlers>
... this list executes when server returns a fault ...
</faultHandlers>
</WebServiceInvoker>

最新コメント