RemoteObject を使う際に、実行時と非同期結果取得時に何かしら処理を挟みたいという要望がありました。継承したら楽勝じゃね?と試してみましたが .mxml ファイルでメソッドを定義しようとするとエラーが出ます。
RemoteObject を継承した MyRemoteObject.as
package hoge { import mx.controls.Alert; import mx.rpc.AbstractOperation; import mx.rpc.events.InvokeEvent; import mx.rpc.remoting.mxml.RemoteObject; public dynamic class MyRemoteObject extends RemoteObject { public function MyRemoteObject(destination:String=null) { super(destination); convertParametersHandler=this.convertParameter; convertResultHandler=this.convertResult; this.addEventListener(InvokeEvent.INVOKE, this.service_invokeHandler); } protected function convertParameter(parameters:Array):Array { Alert.show("convertParameter"); return parameters; } protected function service_invokeHandler(event:InvokeEvent):void { Alert.show("invoke"); } protected function convertResult(result:*, operation:AbstractOperation):* { Alert.show("convertResult"); return result; } } }.mxml の一部抜粋
<hoge:MyRemoteObject 〜> <mx:method 〜 /> <-ここでエラーが出る。(エラーメッセージは忘れた・・・) <mx:method 〜 /> <-ここでエラーが出る。(エラーメッセージは忘れた・・・) </hoge:MyRemoteObject><mx:RemoteObject 〜> <mx:method 〜 /> <-これだとエラーが出ない。 <mx:method 〜 /> </mx:RemoteObject>
これの回避方法がこちらに載っていました。
Adobe Community: Extending RemoteObject and/or Operation
このページで紹介されている、下記URLに置いてあるソースを参考にしました。(MyRemoteObject は dynamic クラスに変更)
swizrpc - Revision 2: /trunk/src/org/riaforge/swizrpc/rpc/remoting/mxml
まず、mx.rpc.remoting.mxml.Operation も継承して、
package hoge { import mx.controls.Alert; import mx.rpc.AbstractOperation; import mx.rpc.events.InvokeEvent; import mx.rpc.remoting.mxml.RemoteObject; [DefaultProperty("operationList")] public dynamic class MyRemoteObject extends RemoteObject { public function MyRemoteObject(destination:String=null) { super(destination); convertParametersHandler=this.convertParameter; convertResultHandler=this.convertResult; this.addEventListener(InvokeEvent.INVOKE, this.service_invokeHandler); } public function set operationList(ol:Array):void { if (ol == null) operations = null; else { var op:AbstractOperation; var ops:Object = new Object(); for (var i:int = 0; i < ol.length; i++) { op = AbstractOperation(ol[i]); var name:String = op.name; if (!name) throw new ArgumentError("Operations must have a name property value for HTTPMultiService"); ops[name] = op; } operations = ops; } } public function get operationList():Array { // Note: does not preserve order of the elements if (operations == null) return null; var ol:Array = new Array(); for (var i:String in operations) { var op:AbstractOperation = operations[i]; ol.push(op); } return ol } protected function convertParameter(parameters:Array):Array { Alert.show("convertParameter"); return parameters; } protected function service_invokeHandler(event:InvokeEvent):void { Alert.show("invoke"); } protected function convertResult(result:*, operation:AbstractOperation):* { Alert.show("convertResult"); return result; } } }MyOperation.as
package hoge { import mx.rpc.remoting.mxml.Operation; public class MyOperation extends Operation { } }
MeRemoteObject に DefaultProperty メタデータタグを指定して、.mxml ファイルで子要素を書けるようにします。
子要素を受け取るプロパティ(ここでは、operationList)は、mx.rpc.remoting.mxml.RemoteObject の operation プロパティのラッパーみたいな感じですね。
これで、.mxml ファイルは次のように書けます。
<hoge:MyRemoteObject 〜> <hoge:MyOperation 〜 /> <hoge:MyOperation 〜 /> </hoge:MyRemoteObject>
あとは、MyRemoteObject を MyOperation のイベント登録処理時に 別のメソッドを引っ掛けて〜みたいな事をすれば出来そうな感じ。
Flex/ActionScript よく分かってないので、間違ってる or 他にも良い方法があるよ〜等ありましたらコメントお願いしますm(_ _)m