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 :

dédoubler le context (this) ?


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 dédoubler le context (this) ?
    Bonjour à tous
    j'ai une methode de maClass "resizeColumn" dont j'ai besoin d'utiliser deux context a la fois alors que this reprensente un seul.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    _resizeColumn:function () {
                            //ici je veux que this sera l'objet GridContainer qui sera redimentionne
                    	//recuperer l'id de la colonne redimmensionnee
                        var selecteur = "#" + this.currentColumn.getAttribute("idsouszone");
                         ........
                        //et ici je veux que this poite sur maClass pour appeller sa fonction setCssRule
                        // affecter la nouvelle valeur de la regle a la matrice css
                        this._setCssRule(selecteur, proprietes + valeur);
                    },
    et voila l'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dojo.connect(monGrid, "resizeColumnOff", null, this._resizeColumn);
    donc comment je peux regler le problème de plusieurs context ??

  2. #2
    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
    C'est impossible en l'état. Tur dois gérer deux variables (a minima le this et une autre).

    ERE
    Quand une tête pense seule, elle devient folle.

  3. #3
    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.
    c'est ca ce que j'ai fait, j'ai déclaré une variable js en dehors de maClass,et je l'initialise par this dans mon constructeur et il marche bien, mais n'est pas sécurise car n'importe qui peut la modifier car c'est une variable globale ?
    et Merci.

  4. #4
    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,

    Tu peux simuler la portée d'une variable privée.
    Ce n'est pas du dojo mais du pur Javascript.

    ERE
    Quand une tête pense seule, elle devient folle.

  5. #5
    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
    sachant que la porté de variable javascript se diffère selon un bloc de code,
    et dans mon cas j'ai une classe dojo dans un fichier .js,et ma variable est déclaré en dehors de ma classe c-à-d globale pour la classe, alors pour l'utilisateur de ma classe s'il a modifie la valeur de ma variable le traitement de la classe ne marchera plus.
    donc comment je peux interdire à l'utilisateur de la modifier?
    et Merci.

  6. #6
    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,

    Crée tes variables privées dans le scope d'une fonction anonyme:
    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
    (function(){
     
     var privee= "foo";
      var privFunc = function(){
        return privee;
      }
     
     dojo.declare("A",null, {
           traitement: function() {
               var c = privFunc();
               ...
           }
       }
     );
    })();
     
    var a = new A();
    a.traitement();
    //a.privee=2;   <- ERREUR
    ERE
    Quand une tête pense seule, elle devient folle.

  7. #7
    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
    Salut,
    merci, mais privee c'est une variable javascript (var privee), c'est pas une propriete de la classe A donc on va pas mettre (a.privee=2),
    alors si on modifier la variable (privee=2) la console.log affiche 2, alors la variable est toujours accessible par l'utilisateur.
    et Merci.

  8. #8
    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
    Citation Envoyé par Zineb1987_UNI Voir le message
    Salut,
    merci, mais privee c'est une variable javascript (var privee), c'est pas une propriete de la classe A donc on va pas mettre (a.privee=2),
    alors si on modifier la variable (privee=2) la console.log affiche 2, alors la variable est toujours accessible par l'utilisateur.
    et Merci.
    Oups j'ai déraillé !

    Ce que je voulais te montrer c'est que privFunc et privee sont accessibles par la class mais pas par l'utilisateur, ce qui équivaut à faire une variable privée dans ta class.

    ERE
    Quand une tête pense seule, elle devient folle.

  9. #9
    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,
    donc est ce qu'il y a pas une solution pour mon cas?
    et Merci

  10. #10
    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
    Je pense que si tu mets en oeuvre ce que je t'ai écrit dans le post précédent cela le fera.

    ERE
    Quand une tête pense seule, elle devient folle.

  11. #11
    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,
    bon je vois, mais j'ai un petit souci :
    c'est que dans maClass qui hérite du [dijit._Widget, dijit._Templated] , j'ai un templateString dont j'ai mis une boite de dialogue avec des éléments html (select,button....),et dans ces éléments-là j'appelle des fonctions de maClass, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    dojo.declare(
            "maClass",
            [dijit._Widget, dijit._Templated],
            {
            	templateString:.....
    "<label for='paddingTop'>Top:</label><select id='padding-top' " +
            	"jsId='padding-top' class='petitChamp' dojoType='dijit.form.ComboBox'" +
            	" onchange='pointeurmaClass.maFonction();'>" +
     
            	"<option value='2'>2</option><option value='4'>4</option>" +
            	"<option value='6'>6</option></select>" +
    ......
    alors que à l'interieur du templateString ne connais pas la variable pointeurmaClass ??
    et Merci

  12. #12
    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 !

    Tu ne dois pas programmer ainsi un widget (et un objet en règle générale) ! Faire référence dans ta classe à une variable d'instance en dur est énorme !

    Non tu dois passer par le mécanisme qui te permet de rester au sein de ton widget: dojoAttachEvent. Documente toi sur l'écriture d'un widget mais ton code de template donnera à peu près:

    ancien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    "<label for='paddingTop'>Top:</label><select id='padding-top' " +
            	"jsId='padding-top' class='petitChamp'   
          dojoType='dijit.form.ComboBox'" +
          " onchange='pointeurmaClass.maFonction();'>" +
    nouveau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "<label for='paddingTop'>Top:</label><select id='padding-top' " +
            	"jsId='padding-top' class='petitChamp'   
          dojoType='dijit.form.ComboBox'" +
          "dojoAttachEvent='onChange:maFonction'>" +
    D'autre part, n'oublie pas que ton widget doit avoir l'attribut widgetsInTemplate:true

    ERE
    Quand une tête pense seule, elle devient folle.

  13. #13
    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 widgetsInTemplate: true,
    Merci emmanuel.remy,
    voila l'exemple que j'ai fait avec le dojoAttachEvent :

    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
    64
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Zineb</title>
     
    <link rel="stylesheet" type="text/css" media="screen"
            href="../monTest/dojo/dojo/resources/dojo.css"/>
    <link rel="stylesheet" type="text/css" media="screen"
            href="../monTest/dojo/dijit/themes/soria/soria.css"/>
     
    <script
        language="JavaScript"
        src="../monTest/dojo/dojo/dojo.js"
        djConfig="parseOnLoad: false, isDebug : true">
    </script>  
     
    <style type="text/css">
    .zi {
    background : orange;
    }
     
    </style>
     
    <script type="text/javascript">
    dojo.addOnLoad(function () {
    	dojo.require("dojo.parser");
    	dojo.require("dijit._Widget");
    	dojo.require("dijit._Templated");
    	dojo.require("dijit.form.Button");
     
     
    	dojo.declare("Zineb",[dijit._Widget, dijit._Templated],{
    		templateString : "<div>"+"<button id='bt' dojoAttachEvent='onclick: oof'>Create Widget</button>"+"</div>",
    		widgetsInTemplate: true,
    		node : null,
    		constructor: function (params, node) {
    			this.node = node;
    			console.log('node widget == ',this.node);
    		},
    		startup: function () {
    			console.log('{---- start up ----}');
    			var bt = new dijit.form.Button(
                        {},
                         dojo.byId("bt"));
                console.log('bt ',bt);
    		},
    		oof : function () {
    			console.log('create event');
    		}
    	});
    	//dojo.parser.parse();
     
    	var myWidget = new Zineb({},dojo.byId('widget'));
    	console.log('myWidget --)>  ',myWidget);
    	myWidget.startup();
    });
     
    </script>       
    </head>
    <body class='soria'>
    <div id="widget"></div>
    </body>
    </html>
    meme si j'ai mis widgetsInTemplate: true, ca marche pas onclick ?

Discussions similaires

  1. [POO] Using $this when not in object context
    Par rugueux dans le forum Langage
    Réponses: 4
    Dernier message: 26/09/2011, 14h49
  2. Réponses: 7
    Dernier message: 16/07/2009, 08h13
  3. problème Name jdbc is not bound in this Context
    Par twist83 dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 19/11/2008, 18h30
  4. Fatal error: Using $this when not in object context
    Par lavande dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2008, 20h17
  5. [FOP] [ERROR] non-static variable this cannot be referenced from a static context
    Par cash3000 dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/05/2006, 16h46

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