Is it possible to define multiple RemoteObjects in MXML?
For instance:
//amf_tests.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.rpc.events.ResultEvent; import mx.controls.Alert; [Bindable] private var serviceTypes:Object; // the remote object service names and instances [Bindable] private var ro:RemoteObject; // the selected service private function init() { serviceTypes = { amfphp: amfphp_ro, zendamf: zendamf_ro, sabreamf: sabreamf_ro }; } private function sendRemoteServiceRequest():void { ro = serviceTypes[serviceType.text]; ro.sayHi(); ro.sayBye(); } private function resultHandler(event:ResultEvent):void { Alert.show(event.result.toString()); } private function faultHandler(event:FaultEvent):void { Alert.show(event.fault.faultString); } private function getKeys(obj:Object):ArrayCollection { var keys:ArrayCollection = new ArrayCollection(); for (var key:String in obj) { keys.addItem(key); } // there's got to be a better way to sort than this keys = new ArrayCollection(keys.toArray().sort(Array.CASEINSENSITIVE)); return keys; } \]]> </mx:Script> <mx:RemoteObject id="amfphp_ro" source="amf_tests_amfphp.HelloWorld" destination="amfphp"> <mx:method name="sayHi" result="resultHandler(event)"/> <mx:method name="sayBye" result="resultHandler(event)"/> </mx:RemoteObject> <mx:RemoteObject id="zendamf_ro" source="amf_tests_zendamf.HelloWorld" destination="zenfamf"> <mx:method name="sayHi" result="resultHandler(event)"/> <mx:method name="sayBye" result="resultHandler(event)"/> </mx:RemoteObject> <mx:RemoteObject id="sabreamf_ro" source="amf_tests_sabreamf.HelloWorld" destination="sabreamf"> <mx:method name="sayHi" result="resultHandler(event)" fault="faultHandler(event)"/> <mx:method name="sayBye" result="resultHandler(event)" fault="faultHandler(event)"/> </mx:RemoteObject> <mx:HBox> <mx:Label text="Service Type:"/> <mx:ComboBox id="serviceType" dataProvider="{getKeys(serviceTypes)}"/> <mx:Button label="Send Request" click="sendRemoteServiceRequest()"/> </mx:HBox> </mx:Application>
// services-config.xml
<?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service id="amfphp-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="amfphp"> <channels> <channel ref="my-amfphp"/> </channels> <properties> <source>*</source> </properties> </destination> </service> <service id="zendamf-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="zendamf"> <channels> <channel ref="my-zendamf"/> </channels> <properties> <source>*</source> </properties> </destination> </service> <service id="sabreamf-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">> <destination id="sabreamf"> <channels> <channel ref="my-sabreamf"/> </channels> <properties> <source>*</source> </properties> </destination> </service> </services> <channels> <channel-definition id="my-amfphp" class="mx.messaging.channels.AMFChannel"> <endpoint uri="/amfphp/gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> <channel-definition id="my-zendamf" class="mx.messaging.channels.AMFChannel"> <endpoint uri="/zendamf/index.php" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> <channel-definition id="my-sabreamf" class="mx.messaging.channels.AMFChannel"> <endpoint uri="/sabreamf/index.php" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
Maybe there’s a typo, but amfphp works, and all the others claim there’s no channel associated with the destination:
[MessagingError message=’Destination ‘sabreamf’ either does not exist or the destination has no channels defined (and the application does not define any default channels.)’]
My workaround is to declare the other RemoteObjects in the init() function and not try to use the <mx:RemoteObjects> and the services-config.xml. Definitely less elegant:
private function init():void { zendamf_ro.source = "HelloWorld"; zendamf_ro.destination = "zendamf"; zendamf_ro.endpoint = "http://localhost/zend_amf/index.php"; sabreamf_ro.source = "HelloWorld"; sabreamf_ro.destination = "sabreamf"; sabreamf_ro.endpoint = "http://localhost/SabreAMF/index.php"; serviceTypes = {amfphp: amfphp_ro, zendamf: zendamf_ro, sabreamf: sabreamf_ro}; }