Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > Ext JS / Sencha
Ext JS / Sencha Ext JS / Sencha Forum d'entraide sur les frameworks Ext JS et Sencha. Avant de poster : FAQ ExtJS / Sencha, 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 07/06/2011, 15h55   #1
Futur Membre du Club
 
Inscription : juin 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 46
Points : 19
Points : 19
Par défaut Visibilité de variable

Bonjour,

J'ai un problème assez récurent en JavaScript lié à la visibilité de mes variables.
Je vais mettre un bout de code tout simple et je vous demanderais de me dire comment vous auriez procédé:
C'est l'ébauche d'une classe pour gérer la traduction.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
function Translation()
{
	var translationTable;
	this.translateEntoFR = function(stringToTranslate)
	{
		console.log(stringToTranslate);
		console.log(this.translationTable);
	}
 
	Ext.Ajax.request({
	    url: 'common/gettraductiontable?ajax=1',
	    callback: function(options,success,response){
	    //this.translationTable=Ext.util.JSON.decode(response.responseText);
              // version simplifiée pour l'exemple:
               this.translationTable = ('yes:oui')
	     }
	 });
}
Mon problème est que this.translationTable reste "undefined" car dans le e Ext.Ajax.request, le this n'est plus reconnu.
Comment faire pour sortir le résultat de la requête des "({})" de l'Ext.Ajax.request?

D'avance merci pour votre aide.
Leduc08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 16h21   #2
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 421
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 421
Points : 2 809
Points : 2 809
poster les question extj dans le forum dédier

mais voici la réponse
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function Translation()
{
  this.translationTable=null;
  this.translateEntoFR = function(stringToTranslate)
  {
    console.log(stringToTranslate);
    console.log(this.translationTable);
  }
 
  Ext.Ajax.request({
      url: 'common/gettraductiontable?ajax=1',
      scope: this,
      failure: function(response, requester){
          console.log(requester.url + ' : ' + response.statusText)
      },
      success: function(response, requester){
        requester.scope.translationTable = Ext.util.JSON.decode(response.responseText);
      }
  });
}
l'autre solution consiste à utiliser createCallBack

pour info il ne s'agit pas là d'un pb de portée de variable mais d'un pb de référence.

dans le début de la fonction on définit un membre de l'objet. ensuite on fait appel Ext.Ajax.request auquel on passe en paramètre un objet définit à la voléest un objet this dans cet objet est l'objet lui même par définition.

donc déjà la référence n'est pas l'objet de départ mais celui construit dynamiquement.
Code :
1
2
3
4
5
6
7
8
test = function() {
 this.truc=45;
 this.toto =  {
    fn: function() {
      alert(this.truc); //error this ici c'est l'objet test.toto et non l'objet test
    }
 }
}
ensuite la fonction Ext.Ajax.request créé un objet request (XHR) et copie tout les champs de l'objet qu'on lui à fourni en paramètre dans l'objet request.

les méthodes sont alors détachées de leur objet originel et pour être attaché à cet objet request. this est donc à l'exécution c'est objet request.


A+JYT
sekaijin est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 18h10   #3
Futur Membre du Club
 
Inscription : juin 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 46
Points : 19
Points : 19
Bonjour Sekajin,

Désolé pour l'erreur d'emplacement de POST, j'étais persuadé que cette problèmatique était liée au javaScript et non à l'ExtJS.

Merci pour ta réponse, mais malheureusement elle ne semble pas fonctionner chez moi.
Le console.log de ma méthode translateENtoFR me renvoi "null", j'en déduis donc que ce qui est fait dans l'"Ext.Ajax.request" n'est pas appliqué à ma variable translationTable, ou est effectuée après.
En tous cas je vais creuser au niveau du "requester.scope."

PS: Tu me confirmes que le sekajin qui poste sur le forum Zend est le même que celui qui poste ici? ;-)
Leduc08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 20h40   #4
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 421
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 421
Points : 2 809
Points : 2 809
la réponse ajax est asynchrone
donc à priori tu ne sais pas quand success sera appelé.

A+JYT
sekaijin est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 08h31   #5
Futur Membre du Club
 
Inscription : juin 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 46
Points : 19
Points : 19
Merci pour la réponse.

Ok sur l'asynchrone, du coup je modifie mon code pour que cela fonctionne et ça me donne ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
function Translation()
{
  this.translationTable=null;
  this.translateEntoFR = function(stringToTranslate)
  {
	  Ext.Ajax.request({
	      url: 'common/gettraductiontable?ajax=1',
	      scope: this,
	      failure: function(response, requester){
	          console.log(requester.url + ' : ' + response.statusText)
	      },
	      success: function(response, requester){
	        requester.scope.translationTable = Ext.util.JSON.decode(response.responseText);
	        console.log(this.translationTable);
	      }
	  });
  }
}
Maintenant, le but est d'initialiser une seule fois la classe Translation, de récupérer mon tableau de traduction 1 seule fois, et ensuite d'appeler la méthode translateENtoFR pour chaque champ à traduite.
--> En php, j'aurai mis l'appel a la requête AJAX dans le init de la classe, mais en javascript la méthode proposée était celle que j'ai mis dans mon premier exemple (incompatible avec la requête asynchrone), quelle est donc la bonne méthode?

Encore merci pour ton aide.
Leduc08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 08h59   #6
Invité de passage
 
Femme
Développeur .NET
Inscription : septembre 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Industrie

Informations forums :
Inscription : septembre 2011
Messages : 3
Points : 2
Points : 2
Par défaut petite question suplémentaire

une petite question ... pourquoi ne peut t-on pas faire le console.log à l'extérieur de l'Ajax.Request?
eemmaa 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 20h38.


 
 
 
 
Partenaires

Hébergement Web