Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > Mootools
Mootools Forum d'entraide sur le framework MooTools. Avant de poster : Tutoriels Mootools, FAQ MooTools, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/10/2011, 17h45   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 0
Points : 0
Par défaut objet appel externe et domready

Bonjour à la cantonade,
je veux appeller une fonction interne d'un objet mais avec domready (mootools)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
function Formulaire() {}
Formulaire.prototype = {
	couleur_creation: undefined,	
	init: function (coul_creation) {
		this.couleur_creation = coul_creation;
	        window.addEvent('domready', function() {this.pourCreation();});	
	},
	pourCreation: function() {
		alert('creation');
       }
}
 
myform = new Formulaire();
myform.init('#dcfbdc');
Alors ca ne trouve pas le this.pourCreation()
ce qui est normal car ca s'execute en dehors de l'objet
j'ai essayé avec Formulaire.pourCreation();
mais c'est pas mieux.

Bien sur avec
Code :
1
2
3
4
 
myform = new Formulaire();
myform.init('#dcfbdc');
window.addEvent('domready', function() {myform.pourCreation();});
la ca marche, mais je ne suis plus dans l'objet...

Auriez vous une solution. Merci!
mjeandon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 20h20   #2
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 944
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 944
Points : 4 776
Points : 4 776
Bonsoir,
il te faut encapsuler le fonction dans une fonction anonyme à laquelle tu passes ton objet en paramètre
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Formulaire.prototype = {
  couleur_creation: undefined,
  init: function (coul_creation) {
    this.couleur_creation = coul_creation;
    // encapsulage dans fonction anonyme
    (function( obj){
      window.addEvent( 'domready', function(){
          obj.pourCreation();
        });
    })(this); // passage de this en parametre
  },
  pourCreation: function(){
      alert(this.couleur_creation );
    }
}
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 08h10   #3
Responsable JavaScript & AJAX

 
Avatar de vermine
 
Inscription : mars 2008
Messages : 2 690
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mars 2008
Messages : 2 690
Points : 5 760
Points : 5 760
Bonjour,

Je ne suis pas sûr que la référence au domready puisse se faire à l'intérieur d'un objet.

Votre seconde tentative est la bonne, il me semble. Voici comment je l'ai retravaillée :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
function Formulaire() {}
 
Formulaire.prototype = {
	couleur_creation: undefined,	
	init: function (coul_creation) {
		this.couleur_creation = coul_creation;
 
	},
	pourCreation: function() {
		alert(this.couleur_creation);
       }
}
 
 
myform = new Formulaire();
myform.init('#dcfbdc'); 
 
window.addEvent('domready', function() {
 
   myform.pourCreation();
 
});
J'ai bien précisé alert(this.couleur_creation);.


Edit : Et bien on dirait que la version de NoSmoking fonctionne également.
__________________
Elen Poukram - Isegoria - Sandawe
vermine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 10h49   #4
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 0
Points : 0
Merci de vos rapides reponses.

NoSmoking, j'aurai jamais trouvé ca tout seul, d'ailleurs, y aurait-il un tuto qui causerait de ces "encapsulage dans fonction anonyme" car j'avoue c'est un peu abstrait pour moi, je vois que ca marche, mais de la à comprendre le fonctionnement!

J'ai d'autre part un 2eme probleme, presque similaire au précédant - appel d'une function interne à l'objet de l'exterieur, avec un bouton et son "onclick"

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
function Formulaire() {}
 
Formulaire.prototype = {
	ajax_file: 'myfile.php',
	createButtons: function() {
		if (document.getElementById('panelButtons')) {
			inp = document.createElement('input');
			inp.type = 'button';
			inp.value = 'Modifier';
			inp.id = 'btn_modify';
			if (document.addEventListener) {
				inp.addEventListener('click',this.pourModifier,false);
			}	
			else if (document.attachEvent) {
				inp.attachEvent('click',this.pourModifier);
			}		
			document.getElementById('panelButtons').appendChild(inp);
                }
        },
        pourModifier: function() {
                alert(this.ajax_file);
        }
}
Quand je clique sur le bouton, je rentre bien dans la function "pourModifier"
mais les variables sont undefined
et le "alert" affiche "undefined"

Avez vous une soluce?!!! Merci de votre aide.
mjeandon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 11h11   #5
Responsable JavaScript & AJAX

 
Avatar de vermine
 
Inscription : mars 2008
Messages : 2 690
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mars 2008
Messages : 2 690
Points : 5 760
Points : 5 760
Si l'on regarde votre premier exemple, vous initialisez votre variable avec this :

Code :
this.couleur_creation = coul_creation
Et on l'utilise également avec this :

Code :
alert(this.couleur_creation );
Dans votre second exemple, vous initialisez la variable sans this :

Code :
ajax_file: 'myfile.php'
Mais vous l'utilisez avec this :

__________________
Elen Poukram - Isegoria - Sandawe
vermine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 12h54   #6
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 0
Points : 0
non non c'est pareil
j'ai essayé avec

Code :
1
2
3
4
5
6
7
 
	initAjax: function(file) {
		this.ajax_file = file;
	}
...
 
myform.initAjax('myfile.php');
C'est pareil
j'ai toujours le alert qui renvoi "undefined"
mjeandon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 22h52   #7
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 944
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 944
Points : 4 776
Points : 4 776
je ne sais par quel bout commencer...
...this fait référence à l'objet en cours.

Lorsque que tu es dans la définition de l'objet, le this représente effectivement l'objet, mais lorsque tu écris inp.addEventListener('click',this.pourModifier,false);, l'objet en cours, au moment de la réalisation de l'événement click, sera le bouton sur lequel tu viens de cliquer, d'où la réponse undefined car effectivement ton button n'a pas de méthode pourModifier.

Pour palier à ce problème de closure, il existe plusieurs façons de faire.

La méthode la plus simple, si tu n'as pas d'autre événement à mettre sur le onclick de ton button est de faire au plus simple
si l'on écrit...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
// NE MARCHE PAS
  createButtons: function() {
    if (document.getElementById('panelButtons')){
      inp = document.createElement('input');
      inp.type  = 'button';
      inp.value = 'Modifier';
      inp.id    = 'btn_modify';
      document.getElementById('panelButtons').appendChild(inp);
      inp.onclick  = function(){
        this.pourModifier();
      }
    }
  }
...le this, on la vu ci dessus, référencera le button donc cela plantera, il faut garder une référence sur l'objet "créateur", pour se faire on affecte au button une propriété qui mémorise l'objet "créateur"
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
  createButtons: function() {
    if (document.getElementById('panelButtons')){
      inp = document.createElement('input');
      inp.type  = 'button';
      inp.value = 'Modifier';
      inp.id    = 'btn_modify';
      inp.obj   = this;           // on garde la reference le this est l'objet en cours
      document.getElementById('panelButtons').appendChild(inp);
      inp.onclick  = function(){
        this.obj.pourModifier();  // on appel la methode de l'objet createur via le this.obj
      }
    }
  }
On peut également, en utilisant une fonction anonyme comme vu précédemment passer l'objet en paramètre de la fonction, cela permet de ne pas surcharger l'objet button
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  createButtons: function() {
    if (document.getElementById('panelButtons')){
      inp = document.createElement('input');
      inp.type  = 'button';
      inp.value = 'Modifier';
      inp.id    = 'btn_modify';
      document.getElementById('panelButtons').appendChild(inp);
      (function( obj){
        inp.onclick  = function(){
          obj.pourModifier();
        }
      })(this); 
    }
  }
Si tu tiens à tout prix à passer par un addEventListener ou un attachEvent, le principe doit rester le même.

Il existe d'autres méthodes pour y arriver, passage par l'appel d'une fonction qui retourne la référence à la fonction...etc...mais bon

je te propose de lire Programmation objet, il n'y a rien à jeter, tout à dévorer en 3 parties
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 08h54   #8
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 0
Points : 0
SUPER

J'avais essayé de faire le genre 2e methode sans succes
faut dire que la syntaxe de la methode orpheline est un peu tordue

Je vais me replonger dans les 3 volumes de "developpez" car j'avait zappé "this function"

Merci encore.
mjeandon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 10h27   #9
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 0
Points : 0
Apres un peu d'abscence, je reviens vers vous, car je suis un mauvais-mauvais, et je ne trouve pas la reponse tout seul.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
function Formulaire() {
        ......
	this.pourValidation = function() {
		jsonRequest = new Request.JSON({url: this.ajax_file,
			onSuccess: this.retour_ajaxFormulaire,
			onFailure: this.erreur_ajax
		});
		tablo['cas'] = 'save';
		tablo['table'] = 'adresses';
		...
		jsonRequest.post(tablo);	
        }
	this.retour_ajaxFormulaire = function(json) {
               this.pourAffichage(json.retour);
        }
        this.pourAffichage = function(value) {
               alert(value);
        }
}
Alors bien sur ca ne marche pas, le retour du traitement ajax ce fait bien dans la function retour_ajaxFormulaire, mais le "this.pourAffichage" n'est pas trouvé.

J'ai essayé en mettant
Code :
1
2
3
4
5
6
 
	this.retour_ajaxFormulaire = function(json) {
               (function(obj,valeur){
      			obj.pourAffichage(valeur);         	        		
    		})(this,json.retour);	
        }
mais ce n'est pas mieux...
mjeandon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 18h05   #10
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 944
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 944
Points : 4 776
Points : 4 776
ce que l'on a dit sur ce post devrait t'intéresser...
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h57.


 
 
 
 
Partenaires

Hébergement Web