BSoft&Co Humeurs et Rumeurs

14Apr/081

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 :

  1. <mx:remoteobject id="amfphpExemple" source="maClasse" destination="amfphp" showbusycursor="true">
  2.     <mx:method name="maMethode" result="maMethodeResult(event)">
  3.      <mx:arguments>
  4. <parametre1>test1</parametre1>
  5. <parametre2>test2</parametre2>
  6.   </mx:arguments>
  7.  </mx:method>
  8. </mx:remoteobject>

Et son appel en AS3 :

  1. amfphpExemple.getOperation('maMethode').arguments =
  2.  {parametre1 : "toto", parametre2: "retoto"};
  3. amfphpExemple.getOperation('maMethode').send();

Donnerons pour un tout AS3 :

  1. import flash.net.Responder;
  2. import flash.net.NetConnection;
  3.  
  4. public function lanceReqAMF():void {
  5.  public var monAMF:NetConnection = new NetConnection();
  6.  monAMF.connect("url de la gateway AMFPHP");
  7.  monAMF.mymethod = "maClasse.maMethode";
  8.  var responder:Responder = new Responder(reqAMFResult, onFault);
  9.  myremote.call(this.mymethod, responder, parametre1, parametre2);
  10. }

Puis il faudra faire le boulot pour Flex, afin de forcer le passage dans un ObjectProxy.
Par ex :

  1. private function reqAMFResult(result:Array):void {
  2. {
  3.  for (var i:String in result) {
  4.   result[i] = new ObjectProxy(result[i]);
  5.  }
  6.  monArrayCollectionResult = new ArrayCollection(result);
  7.  dispatchEvent(new Event("reqAMFOK"));
  8. }

Et voilà, plus de warning dans tous les sens.

Comments (1) Trackbacks (0)
  1. Sinon il suffit de mettre [Bindable] sur toutes les variables mappées du VO

    package com.vo
    {

    [RemoteClass(alias="vo.ProductVO")]

    public class ProductVO
    {
    public function ProductVO()
    {
    }

    [Bindable]
    public var title:String;

    }
    }

    et là aussi plus de message Smile


Leave a comment

(required)

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

Click to Insert Smiley

SmileBig SmileGrinLaughFrownBig FrownCryNeutralWinkKissRazzChicCoolAngryReally AngryConfusedQuestionThinkingPainShockYesNoLOLSillyBeautyLashesCuteShyBlushKissedIn LoveDroolGiggleSnickerHeh!SmirkWiltWeepIDKStruggleSide FrownDazedHypnotizedSweatEek!Roll EyesSarcasmDisdainSmugMoney MouthFoot in MouthShut MouthQuietShameBeat UpMeanEvil GrinGrit TeethShoutPissed OffReally PissedMad RazzDrunken RazzSickYawnSleepyDanceClapJumpHandshakeHigh FiveHug LeftHug RightKiss BlowKissingByeGo AwayCall MeOn the PhoneSecretMeetingWavingStopTime OutTalk to the HandLoserLyingDOH!Fingers CrossedWaitingSuspenseTremblePrayWorshipStarvingEatVictoryCurseAlienAngelClownCowboyCyclopsDevilDoctorFemale FighterMale FighterMohawkMusicNerdPartyPirateSkywalkerSnowmanSoldierVampireZombie KillerGhostSkeletonBunnyCatCat 2ChickChickenChicken 2CowCow 2DogDog 2DuckGoatHippoKoalaLionMonkeyMonkey 2MousePandaPigPig 2SheepSheep 2ReindeerSnailTigerTurtleBeerDrinkLiquorCoffeeCakePizzaWatermelonBowlPlateCanFemaleMaleHeartBroken HeartRoseDead RosePeaceYin YangUS FlagMoonStarSunCloudyRainThunderUmbrellaRainbowMusic NoteAirplaneCarIslandAnnouncebrbMailCellPhoneCameraFilmTVClockLampSearchCoinsComputerConsolePresentSoccerCloverPumpkinBombHammerKnifeHandcuffsPillPoopCigarette

No trackbacks yet.