IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

Events, listener etc.


Sujet :

ActionScript 3

  1. #1
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut Events, listener etc.
    Salut.

    J'ai un souci a l'utilisation des evenements sous Flex 3.

    Voila ma structure.

    un canvas Toto
    une classe Utils

    J'ai une fonction dans le mxmxl de Toto, on va dire Manage();

    Manage fait appel a une methode de la classe Utils.
    Je dois attendre la fin de la methode de la classe Utils pour continuer mon traitement dans Manage.

    En gros


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Manage()
    {
    addEventListener(Event.COMPLETE, callback);
      utils.bidule();
    } 
     
     
    callback()
    {
    Alert.show("fini");
    removeEventListener(Event.COMPLETE,callback);
     
     
    //RESTE DU TRAITEMENT
     
    }
     
     
    dans la class Utils ...
     
    function bidule()
    {
    dispatchEvent( new Event(Event.COMPLETE));
    }
    Mon souci est que je ne recois JMs le message Event.COMPLETE, et je ne comprends pas pourquoi.

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    Il est possible que l'event complete ne se produise pas dans certain cas
    ioError:IOErrorEvent — The load operation could not be completed.


    securityError:SecurityErrorEvent — A load operation attempted to retrieve data from a server outside the caller's security sandbox. This may be worked around using a policy file on the server.
    http://livedocs.adobe.com/flash/9.0/...#event:ioError

    testez avec le code d'exemple a cette adresse
    http://livedocs.adobe.com/flash/9.0/...xamplesSummary
    sa vous donnera peut être plus d'informations

  3. #3
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    J'ai teste en rajoutant un listener sur une erreur IO comme tu me le demandais, je n'ai rien


    Je poste mes bouts de code pour voir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private	function	Go():void
    			{
     
    				addEventListener(Event.COMPLETE,ConnectedtoDB);
    				addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
     
     
    				DBUtils.ConnectToDB();	
     
    			}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private function errorHandler(e:IOErrorEvent):void {
    				trace("Pb");
    			}
     
    			private	function	ConnectedtoDB():void
    			{
    				Alert.show("fini");
    				//removeEventListener(Event.COMPLETE,ConnectedtoDB);
    			}


    Et le bout de ma classe DBUtils

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    public  class DBUtils extends EventDispatcher
    	{
     
    ....
     
     
    		public	static	function	ConnectToDB():void
    		{
    			Application.application.DBUtils_service.getOperation('ConnectDB').send();
    		}
     
    		public		function	ConnectToDB_Result(evt:ResultEvent):void
    		{			
    			dispatchEvent( new Event(Event.COMPLETE));
    			Alert.show(evt.result.toString());
    		}
     
    }
    Le cheminement est

    Go -> je rajoute des listeneurs -> ConnectDB -> ConnectToDB_Result -> ConnectedtoDB

  4. #4
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    la classe contenant la methode go() dérrive bien de la classe URLLoader ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    URLLoader 
    
    package 
    {
    	 
    	/**
    	 * ...
    	 * @author ...
    	 */
    	public class MyLoader extends URLLoader 
    	{
    		
    		
    		private	function Go():void
    		{
    				
    			addEventListener(Event.COMPLETE,ConnectedtoDB);
    			addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
    			DBUtils.ConnectToDB();	
    		}
    	}
    	
    }

  5. #5
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    Citation Envoyé par guynemer Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.application.DBUtils_service.getOperation('ConnectDB').send();
    hum getOperation('ConnectDB') return t'il un object, si oui de quel type est cette object?
    je pense que la méthode getOperation doit créer un object ou un dérivé d' urlloader il faut arriver a mettre la main dessus pour lui rattacher les events.
    Sinon voir dans send() si la création de l'object ne se fait pas la.
    Dite moi si ça vous a aidé.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    Hum je ne sais pas vrmt.

    voila les prototypages

    mx.rpc.remoting.mxml.RemoteObject.getOperation(name:String):AbstractOperation


    mx.rpc.AbstractOperation.send(...parameters):AsyncToken

    Je ne sais pas si ce sont des composants integres a Flex ou si ce sont des composants du framework amfphp. :/

  7. #7
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    a on se rapproche !
    AbstractOperation fait partis de flex
    http://livedocs.adobe.com/flex/3/lan...Operation.html

    AsyncToken
    http://livedocs.adobe.com/flex/3/lan...syncToken.html

    je pense qu'il faut regarder du coté de addrespondeur

    http://livedocs.adobe.com/flex/3/lan...#addResponder()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    addResponder	()	method
    public function addResponder(responder:IResponder):void
     
    Adds a responder to an Array of responders. The object assigned to the responder parameter must implement mx.rpc.IResponder.
     
    Parameters
    	responder:IResponder — A handler which will be called when the asynchronous request completes.
     
    See also
    mx.rpc.IResponder

    l'article suivant devrait vous aider : http://www.mti.epita.fr/blogs/2008/0...avec-caingorm/
    Dite moi ci c'est le cas !

  8. #8
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    Hum honnetement je n'ai pas compris ce qu'il fallait faire.

    Dsl je debute en AS3

  9. #9
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    tester de creer cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package 
    {
    import mx.rpc.IResponder;
     
    public class MyIResponder extends TestCase implements IResponder
    {
    	public function result ( event : Object ) : void
    	{
    	  // Vous recupérez vos résultats ici puis  
    	 trace(" c'est ok");
    	}
     
    	public function fault (event : Object ) : void
    	{
     	 //pas la peine de coder celle là, ça ne plante jamais :P
    	 trace(" c'est pas ok");
    	}
    }
    }
    puis dan votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public	static	function	ConnectToDB():void
    		{
    			var MyAsyncToken:AsyncToken=Application.application.DBUtils_service.getOperation('ConnectDB').send();
    MyAsyncToken.addResponder(new MyIResponder ());
    		}
    dite moi si sa passe mieux

  10. #10
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    Eh bien merci, ca semble marcher, par contre il faut que j'etudie ca parce que je n'ai pas tout compris.

    EDIT : Je pense avoir saisi le truc. Il me faudrait juste par contre pouvoir specifier la callback a utiliser suite a un retour dans la methode "result".


    Je pensais creer une variable de type function, pour lancer son execution dans "result" .

    C'est faisable ?


    Mon autre problematique est de pouvioir recuperer des donnes suite a mon send.

    La en l'occurence je n'ai pas de retour utile sur une connexion a la base de donnees, mais plus tard il faudra de tte evidence que je recupere le retour.

  11. #11
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    Content que ça marche !
    Si y'as un point que je peux éclaircir dit le moi.

  12. #12
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    ah j'ai edite mon post pendant que tu repondais

  13. #13
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    Citation Envoyé par guynemer Voir le message
    ah j'ai edite mon post pendant que tu repondais
    alors pour le retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    package 
    {
    import mx.rpc.IResponder;
     
    public class MyIResponder extends TestCase implements IResponder
    {
    	public var FunctionCallBack:Function
    	public var objectCallBack:*;
    	function MyIResponder (FunctionCallBack:Function,objectCallBack:*){
    this.FunctionCallBack=FunctionCallBack;
    this.objectCallBack=objectCallBack;
    }
    	public function result ( event : Object ) : void
    	{
    	  // Vous recupérez vos résultats ici puis  
    	 trace(" c'est ok");
    ///on appèle le callBack
    if (FunctionCallBack != null && objectCallBack != null) {
    						FunctionCallBack.call(objectCallBack/*ce paramètre serra utilisé en temp que "this" par la function donc c'est généralement l'instance qui contient la function appelée*/,
    true/* boolean indiquant la reussite*/,data/*infos a faire passer*/ );
    					}
     
    	}
     
    	public function fault (event : Object ) : void
    	{
     	 //pas la peine de coder celle là, ça ne plante jamais :P
    	 trace(" c'est pas ok");
    ///on appèle le callBack
    if (FunctionCallBack != null && objectCallBack != null) {
    						FunctionCallBack.call(objectCallBack/*ce paramètre serra utilisé en temp que "this" par la function donc c'est généralement l'instance qui contient la function appelée*/,
    false/* boolean indiquant le plantage*/,data/*infos a faire passer*/ );
    					}
    	}
    }
    }
    ensuite pour le call back il devra avoir cette forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    public function callBackExec(bres:boolean,data:*):void{
    }
    et on modifira la création de l'object biensure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyAsyncToken.addResponder(new MyIResponder (this,callBackExec));
    et pour finir la function result reçoit normalement un object contenant un champ "result" c'est donc normalement cette object qui doit contenir les variables chargées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    http://www.mti.epita.fr/blogs/2008/01/08/tutoriel-utiliser-flexunit-avec-caingorm/
    public function result ( event : Object ) : void
    {
      // Vous recupérez vos résultats ici puis vous faites vos assert
      var res : ResultVO = event.result as ResultVO;
      assertEquals("Retour invalide", ResultVO.someVar, ceQuonEstCenseObtenir);
    }

  14. #14
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    Vraiment merci de ton aide. Je teste ca pour voir si ca marche.

    Par contre j'y reflechis depuis tout a l'heure mais en fait je crois que je tourne autour du pot sans regler mon reel souci.

    Pr resumer ma problematique est la suivante.

    function ()
    {
    sous_func1();
    "wait(sous_fun1())"
    sous_func2();
    }

    Je dois trouver qqchose qui traduise le "wait" pour que sous_func ne s'execute qu'une fois la sous_fun1 terminee.



    Ta methode marche parfaitement mais j'ai l'impression qu'au final ca ne resoud pas mon souci. Mais peut etre que je me suis embrouille.


    Dans l'etat actuel j'ai un remote object comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <mx:RemoteObject id="DBUtils_service" destination="amfphp" source="DBUtils">
    		<mx:method name="ConnectDB" 
    				   result="defaultResultHandler(event)"
    				   fault="defaultFaultHandler(event)" />
    Ca marche nickel et j'arrive dans defaultResultHandler qd l'operation de connexion a la base est terminee, et j'arrive bien a recuperer mes valeurs de retour.

    Seulement , comme le nom l'indique, c'est une methode "de resultat" generique, et je voudrais l'utiliser depuis plusieurs composants.

    Ce qui me manque c'est comment retourner a ma sous_func2 une fois la methode defaultResultHandler terminee.

    Bien sur je pourrais appeler la methode sous_func en question depuis defaultResultHandler, mais cela reviendrait a creer plein de mx:method differents, et c'est ce que je cherche a eviter.

    Est ce clair ?

  15. #15
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    Je croix avoir cerné.
    Le problème est que le chargement n'est pas bloquant. de ce fait on ne dispose pas de wait.

    La solution que je met en place et la suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    public var working:Boolean;
    public function sous_function1():void{
    working=true;
    var MyAsyncToken:AsyncToken=Application.application.DBUtils_service.getOperation('ConnectDB').send();
    MyAsyncToken.addResponder(this,sous_function2);
     
    }
     
    public function sous_function2():void{
    working=false;
    }
    du coup il faut juste appeler sous_function1() pour lancer le traitement
    en ajoutant un if pour vérifier que le traitement n'est pas déjà en cour

  16. #16
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    oui voila.

    Seul hic.

    sous_func1 est une methode qui est generique et qui sera appellee un peu partout, et forcement sous_func2 sera specifique dans chaque cas.

    C'est un cercle vicieux on dirait. Je me demande si ma conceptin n'est pas simplement mauvaise pr le coup.


    La seule echappatoire que je vois la, c'est de pouvoir faire ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <mx:RemoteObject id="DBUtils_service">
    		<mx:method name="ConnectDB" 
    				   result="defaultResultHandler(event, callback)"
    				    />

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private function defaultResultHandler(evt:ResultEvent, function:callback):void
    		{
    			trace("aye jai fini le premier traitement, je vais au suivant");
                                      callback(evt);
    		}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public	static	function	ConnectToDB(arg, callback):void
    		{
    		Application.application.DBUtils_service.getOperation('ConnectDB').send(arg, callback);}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    private	function	Go():void
    			{
     
    				DBUtils.ConnectToDB("c'est mon argument", ConnectedtoDB);					
    			}
     
     
     
    			private	function	ConnectedtoDB(evt:Resultevent):void
    			{
    				Alert.show("je commence a traiter mon resultat initial et je continue");
     
                                  bla bla bla
     
    			}

  17. #17
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    Maintenant reste a savoir si c'est possible , et si oui comment formaliser ca.

    Je me demande meme si par exemple le prototypage de "send" va me permettre ca

  18. #18
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    alors dans ce cas de figure
    je modifirais sous_function1 pour qu'elle reçoive un type de traitement
    qui serrait renvoyé a sous_function2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public var traitementLecture:Number=1;
    public var traitementAjout:Number=2;
    public var traitementModification:Number=3;
    sous_function1(type_traitement:number){
    }
     
    sous_function2(type_traitement:number){
    switch(type_traitement){
    case 1:
     
    break;
    case 2:
    break;
    }
     
    }
     
    sous_function1(traitementModification);

    ou mieux directement faire passer le callback a function 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sous_function1(callback :Function){
    }
     
    sous_function2(callback :number){
    callback .call();
     
    }

  19. #19
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 21
    Par défaut
    Je vais tester un peu les differentes solutions et si j'ai un souci je reposterai ici.

    Encore une fois, merci de ton aide

  20. #20
    Membre très actif

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 612
    Par défaut
    De rien !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. event listener useWeakReference
    Par bruno.rotrou dans le forum Flex
    Réponses: 2
    Dernier message: 12/10/2009, 14h54
  2. Ajouter dynamiquement un event listener
    Par Jexou dans le forum Flex
    Réponses: 13
    Dernier message: 26/08/2009, 14h41
  3. Checked box + Event listener click
    Par Tiolebucheron dans le forum Ext JS / Sencha
    Réponses: 4
    Dernier message: 17/07/2009, 16h15
  4. Réponses: 59
    Dernier message: 09/11/2007, 17h02
  5. Mettre une methode dans un event listener
    Par FidoDido® dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/07/2006, 21h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo