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

Bibliothèques & Frameworks Discussion :

push ca marche pas sur une variable de classe ? [Dojo]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre régulier Avatar de Zineb1987_UNI
    Inscrit en
    Juin 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 129
    Points : 74
    Points
    74
    Par défaut push ca marche pas sur une variable de classe ?
    Bonjour à tous,
    j'ai une classe dojo avec une propriete de type Array, et pour le remplissage ca marche pas avec push??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dojo.declare(
                "maClass",
                dijit._Widget,
                {
                    _mesSources: new Array(),
    quand je fait
    this._mesSources.push(monGrid);
    il affiche : this._mesSources is undefined !!
    et Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    En js pur ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <script type="text/javascript">
    var objet={monarray:new Array()}
    objet.monarray.push('ça marche!')
    alert (objet.monarray[0])
    </script>

  3. #3
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,

    Comme te le fait remarquer SpaceFrog ton code devrait fonctionner, c'est donc qu'il y a un problème de ton côté

    Néanmoins j'attire ton attention sur une erreur supplémentaire que tu vas commettre dans les instants qui suivront
    Sans faire preuve d'humour tu commets deux erreurs qui sont liées et qui ne s'annulent pas pour autant... Je m'explique: dans ton titre tu parles d'un push sur une variable de class alors que ce que tu souhaites créer c'est une variable d'instance. Où cela se complique c'est que la déclaration que tu réalises est en fait une variable de class !
    Faisons simple: dans Dojo, quand tu déclares une class, alors toute variable déclarée comme un tableau (ou un objet en dur) est une variable de class et non d'instance. Pour déclarer une variable d'instance de type tableau tu dois la déclarer au sein du constructeur, soit la fonction constructor. Plus généralement on recommande (mais c'est peu suivi, malheureusement) de déclarer toutes les variables d'instances au sein du constructeur.
    Techniquement les propriétés déclarées en dehors de la fonction constructor sont ajoutée au prototype, d'où ce comportement "static".

    Je te passe ce code en exemple, il est calqué sur ton cas de figure:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <script type="text/javascript" src="/dojotoolkit/dojo/dojo.js"></script>
     
            <script type="text/javascript">
            djConfig="parseOnLoad: true, isDebug: true";
     
            dojo.declare(
                    "MaClass",
                     null,
                    {
         	              _mesSources: new Array(), //variable de class
         	              compteur : 0         //variable d'instance
                    }
            );
     
            dojo.declare(
                    "MaClassOK",
                    null,
                    {
                    	constructor: function(args) {
                    		this._mesSources= new Array();  //variable d'instance
                    	}
                    }
                    );
     
     
            dojo.addOnLoad(
        	    function(){
    				var c = new MaClass();
    				c._mesSources.push("dataC");
    				//le compteur vaut 1
    				c.compteur++;
    				alert("c._mesSources: " + c._mesSources[0]);
    				alert(c.compteur);
     
    				//affiche exactement la même chose...
    				var d = new MaClass();
    				d._mesSources.push("dataD");
    				//le compteur vaut 1, c'est ok
    				d.compteur++;
    				//affiche dataC et non dataD comme attendu...
    				alert("d._mesSources: " + d._mesSources[0]);
    				//le compteur est bine une variable d'instance, 1
    				alert(d.compteur);
     
    				//en faisant les choses correctement
    				var c2 = new MaClassOK();
    				c2._mesSources.push("dataOK_C");
    				alert("c2._mesSources:" + c2._mesSources[0]);
     
    				var d2 = new MaClassOK();
    				d2._mesSources.push("dataOK_D");
    				alert("d2._mesSources: " + d2._mesSources[0]);
        	    });
        </script>
      </head>
     
      <body>
    		<p>Hello world !</p>
      </body>
    </html>
    Bon dev,

    ERE

  4. #4
    Membre régulier Avatar de Zineb1987_UNI
    Inscrit en
    Juin 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 129
    Points : 74
    Points
    74
    Par défaut
    voila ce que j'ai fait :
    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
     
     
     
    dojo.declare(
    	        "Gabarit",
    	        null,
    	        {
    	            _domDocument: null,
     
    	            constructor: function (_domDocument) {
    	                this._domDocument = _domDocument;
    	                this._zones = new Array();
    	                dojo.query("div.zone", dojo.byId('myBody'))
                        .forEach(function (item) {
                            var maZone = new Zone(item);
                            //ici il m'affiche  undefined
                            console.log('mon tab',this._zones);
                            this._zones.push(maZone);
                        });
                          //alors qu'ici il affiche que c'est un Array ([ ])
    	                console.log('mon tab',this._zones);
    	            },
    donc a l'interieur de la boucle forEach le tableau this._zones est undefined, c'est pour ca que le push marche pas, alors pourquoi il est undefined meme s' il est cree dans le constructeur ?

  5. #5
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Re,
    donc a l'interieur de la boucle forEach le tableau this._zones est undefined, c'est pour ca que le push marche pas, alors pourquoi il est undefined meme s' il est cree dans le constructeur ?
    ... parce que dans ta boucle forEach tu n'es plus dans le scope de ta class mais dans celui de dojo (c'est la fonction dojo.forEach)

    ERE

  6. #6
    Membre régulier Avatar de Zineb1987_UNI
    Inscrit en
    Juin 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 129
    Points : 74
    Points
    74
    Par défaut
    donc la seule solution c'est de passer par un tableau intermediaire pour remplir mon tableau (c-à-d declarer un autre tableau et le remplir dans le forEach puis l'affecter a mon tableau) ??

  7. #7
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Re,
    Regarde la définition de la fonction dojo.foreach car tu peux passer un paramètre supplémentaire qui correspond au scope d exécution de la fonction

    ERE

    -------------------------------------------
    Sent from blackberry os

  8. #8
    Membre régulier Avatar de Zineb1987_UNI
    Inscrit en
    Juin 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 129
    Points : 74
    Points
    74
    Par défaut
    oui je vois, voila les parametres de dojo.forEach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var foo=dojo.forEach(arr: Array|String, callback: Function|String, thisObject: Object?);
    et voila mon forEach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    constructor: function (_domDocument) {
    	                this._domDocument = _domDocument;
    	                dojo.query("div.zone", dojo.byId('myBody'))
                        .forEach(function (item) {
                            var maZone = new Zone(item);
                        });
    ...
    Comment je peux integrer le scope dans ma boucle ?
    et Merci.

  9. #9
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    RE,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    constructor: function (_domDocument) {
    	                this._domDocument = _domDocument;
    	                dojo.query("div.zone", dojo.byId('myBody'))
                        .forEach(function (item) {
                            var maZone = new Zone(item);
                        }, this);
    ...
    ERE

  10. #10
    Membre régulier Avatar de Zineb1987_UNI
    Inscrit en
    Juin 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 129
    Points : 74
    Points
    74
    Par défaut
    Merci emmanuel.remy, ca marche bien

  11. #11
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Cool !
    Pour info il existe la même démarche quand tu fais un fetch sur un store: tu peux ajouter un paramètre au fetch qui correspond au scope d'exécution.

    ERE

  12. #12
    Membre régulier Avatar de Zineb1987_UNI
    Inscrit en
    Juin 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 129
    Points : 74
    Points
    74
    Par défaut
    Merci emmanuel.remy pour l'info

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dojo] Affichage du menu ça marche pas sur une grid
    Par hasnaa1988 dans le forum Bibliothèques & Frameworks
    Réponses: 6
    Dernier message: 12/03/2010, 11h43
  2. Executable C# ne marche pas sur une autre machine
    Par clakinette dans le forum C#
    Réponses: 10
    Dernier message: 25/01/2010, 22h33
  3. Réponses: 1
    Dernier message: 04/11/2009, 15h33
  4. Réponses: 8
    Dernier message: 23/06/2007, 10h38
  5. DATEDIFF() qui ne marche pas sur une version 5.0.xx
    Par vallica dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/05/2006, 17h44

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