Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > jQuery
jQuery Forum d'entraide sur le framework jQuery. Avant de poster : Tutoriels jQuery, FAQ jQuery, Tous les tutoriels JavaScript, 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 08/07/2011, 17h43   #1
Nouveau Membre du Club
 
Étudiant
Inscription : janvier 2006
Messages : 108
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 108
Points : 26
Points : 26
Envoyer un message via MSN à Le Mad
Par défaut Accès aux données avec Json (liste de tableaux)

Bonjour à tous,

Je n'arrive pas à résoudre un problème que j'ai avec l'extraction de données dans une source Json avec Jquery.
J'accède parfaitement à mon tableau fields, mais lorsque je souhaite faire un data[fields[i].name], cela ne me retourne rien...
Quelqu'un a t'il une idée d'une solution pour ce problème ?

Source Json :
Code :
1
2
3
4
5
6
7
8
{"os":
[{"id":"1","value":"AIX"},{"id":"2","value":"HP-UX"},{"id":"3","value":"Linux"},{"id":"4","value":"Solaris"},{"id":"5","value":"Windows"},{"id":"6","value":"Autre"}],
"priority":
[{"id":"1","icon":"priority_blocker.gif","value":"Urgent"},{"id":"3","icon":"priority_major.gif","value":"Normal"},{"id":"4","icon":"priority_minor.gif","value":"Low"}],
"security":
[{"id":"1","value":"Aucune"},{"id":"2","value":"value1"},{"id":"3","value":"value2"},{"id":"4","value":"Support"}],
"fields":
[{"hidden":false,"name":"priority","required":true,"type":"selectImg"},{"hidden":false,"name":"security","required":true,"type":"select"},{"hidden":false,"name":"os","required":true,"type":"select"},{"hidden":false,"name":"component","required":false,"type":"input"},{"hidden":false,"name":"summary","required":true,"type":"input"},{"hidden":false,"name":"description","required":true,"type":"textarea"},{"hidden":false,"name":"attachment","required":false,"type":"file"},{"hidden":false,"name":"duedate","required":false,"type":"input"}]}
Mon traitement Jquery.ajax :
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
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
$.ajax({
      type: "POST",
      url: portletContextURL,
      data: {productId:$('#product').val(), issueTypeId:$('#issueType').val()},
      dataType: 'json',
      cache: false,
      success: function(data){
    	  // Parcours des champs.
    	  var myFields = data['fields'];
    	  for(var i = 0 ; i < myFields.length ; i++){
    		  if(myFields[i].type == 'selectImg' || myFields[i].type == 'select'){
    			  // On vide le composant.
    			  $('#'+myFields[i].name).children().remove();
----------> Mon problème est ici :
    			  var mySelectField = data[myFields[i].name];
    			  // Parcours des valeurs et affichage de celles-ci.
    			  for(var y = 0 ; y < mySelectField.length ; y++){
    				  if('#'+myFields[i].type == 'select'){
    					  $('#'+myFields[i].name).append($('<option></option>').attr('value',mySelectField[y].id).text(mySelectField[y].value));
    				  }else if('#'+myFields[i].type == 'selectImg'){
    					  $('#'+myFields[i].name).append($('<option></option>').attr('value',mySelectField[y].id).attr('title',portletContextRoot+'/img/'+mySelectField[y].icon).text(mySelectField[y].value));
    				  }
    			  }
    			  // Si le champs est obligatoire, on ajoute la classe de contrôle.
    			  if(myFields[i].required){
    				  $('#'+myFields[i].name).addClass('notNull');
    			  }else{
    				  $('#'+myFields[i].name).removeClass('notNull');
    			  }
    			  /*
    			   * Si le champs n'est pas caché, on recharge le dropdownlist
    			   * et on affiche le bloc correspondant.
    			   * */ 
    			  if(!myFields[i].hidden){
    				  $('#'+myFields[i].name).msDropDown().data('dd');
	    	    	  $('#'+myFields[i].name+'Bloc').show();
    			  }
    		  }else{
    			  // Si le champs est obligatoire, on ajoute la classe de contrôle.
    			  if(myFields[i].required){
    				  $('#'+myFields[i].name).addClass('notNull');
    			  }else{
    				  $('#'+myFields[i].name).removeClass('notNull');
    			  }
    			  // Si le champs n'est pas caché, on recharge le dropdownlist.
    			  if(!myFields[i].hidden){
	    	    	  $('#'+myFields[i].name+'Bloc').show();
    			  }
    		  }
    		  // Affichage du bouton d'action.
    		  $('#actionBloc').show();
    	  }
      }
});
Grosso-modo, en fonction du type de champs, j'affiche le composant HTML et je souhaite récupérer les valeurs des selects.

Merci pour votre aide.
Le Mad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 10h29   #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 774
Points : 4 774
Bonjour,
il semblerait que tu fasses une erreur de raisonnement
Si l'on prend la ligne
Code :
var myFields = data['fields'];
myFields vaut
Code :
1
2
3
4
5
6
7
8
9
10
11
12
var myFields = data['fields'] =
/* tableau en memoire */
[
  {"hidden":false, "name":"priority",   "required":true,  "type":"selectImg"},
  {"hidden":false, "name":"security",   "required":true,  "type":"select"},
  {"hidden":false, "name":"os",         "required":true,  "type":"select"},
  {"hidden":false, "name":"component",  "required":false, "type":"input"},
  {"hidden":false, "name":"summary",    "required":true,  "type":"input"},
  {"hidden":false, "name":"description","required":true,  "type":"textarea"},
  {"hidden":false, "name":"attachment", "required":false, "type":"file"},
  {"hidden":false, "name":"duedate",    "required":false, "type":"input"}
]
maintenant quand tu fais
Code :
var mySelectField = data[myFields[i].name];
tu vas obtenir successivement :
pour i = 0 -> "priority"
pour i = 1 -> "security"
pour i = 2 -> "os"
 ...etc...
pour i = 7 -> "duedate"
mySelectField est une String

donc quand tu écris
Code :
for(var y = 0 ; y < mySelectField.length ; y++)
mySelectField.length vaut
pour i = 0 -> 8
pour i = 1 -> 8
pour i = 2 -> 2
 ...etc...
pour i = 7 -> 7
donc cela fini par planter car visiblement tu ne pointes pas sur le tableau que tu souhaites...

peut être cherches tu à accéder aux données contenues dans data[mySelectField] soit en fait data[ data['fields'][i].name].
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 08h45   #3
Nouveau Membre du Club
 
Étudiant
Inscription : janvier 2006
Messages : 108
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 108
Points : 26
Points : 26
Envoyer un message via MSN à Le Mad
Bonjour,

Merci pour ta réponse, mais en fait mon raisonnement était juste et mon erreur venait d'ici :

Code :
1
2
3
4
5
6
if('#'+myFields[i].type == 'select'){
  $('#'+myFields[i].name).append($('<option></option>').attr('value',mySelectField[y].id).text(mySelectField[y].value));
}else if('#'+myFields[i].type == 'selectImg'){
   $('#'+myFields[i].name).append($('<option></option>').attr('value',mySelectField[y].id).attr('title',portletContextRoot+'/img/'+mySelectField[y].icon).text(mySelectField[y].value));
}
Voilà, une erreur toute bête qui m'a fait perdre un temps fou.

Merci encore pour ta participation.
Le Mad 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 04h16.


 
 
 
 
Partenaires

Hébergement Web