Flex et AMPFPHP : Warning pour les données reçues!
"unable to bind to property 'XXX' on class 'Object' (class is not an IEventDispatcher)"
Marre de voir ce message en mode debug ?
Ce problème arrive souvent lorsque l'on récupère des données complexes depuis un HTTPService dans un Remote Object.
En effet FLex (version 2, pas testée avec la 3) a du mal avec les infos renvoyées depuis de l'AMFPHP contrairement à un WebService par exemple.
Les données reçues d'un tableau sont passées depuis un WebService ou un HTTPService dans un ArrayCollection (ou un Object dans un ObjectProxy). Flex a alors besoin d'un coup de main lorsque les données proviennent de l'AMF.
Pour éviter cela, ne pas construire son objet en mxml, mais en AS3, via l'objet 'Responder'.
par ex l'appel en MXML :
-
<mx:remoteobject id="amfphpExemple" source="maClasse" destination="amfphp" showbusycursor="true">
-
<mx:method name="maMethode" result="maMethodeResult(event)">
-
<mx:arguments>
-
<parametre1>test1</parametre1>
-
<parametre2>test2</parametre2>
-
</mx:arguments>
-
</mx:method>
-
</mx:remoteobject>
Et son appel en AS3 :
-
amfphpExemple.getOperation('maMethode').arguments =
-
{parametre1 : "toto", parametre2: "retoto"};
-
amfphpExemple.getOperation('maMethode').send();
Donnerons pour un tout AS3 :
-
import flash.net.Responder;
-
import flash.net.NetConnection;
-
-
public function lanceReqAMF():void {
-
public var monAMF:NetConnection = new NetConnection();
-
monAMF.connect("url de la gateway AMFPHP");
-
monAMF.mymethod = "maClasse.maMethode";
-
var responder:Responder = new Responder(reqAMFResult, onFault);
-
myremote.call(this.mymethod, responder, parametre1, parametre2);
-
}
Puis il faudra faire le boulot pour Flex, afin de forcer le passage dans un ObjectProxy.
Par ex :
-
private function reqAMFResult(result:Array):void {
-
{
-
for (var i:String in result) {
-
result[i] = new ObjectProxy(result[i]);
-
}
-
monArrayCollectionResult = new ArrayCollection(result);
-
dispatchEvent(new Event("reqAMFOK"));
-
}
Et voilà, plus de warning dans tous les sens.
