2009-10-13 6 views
0

Toute personne qui peut m'aider sera très appréciée. J'ai l'impression d'avoir été un peu fougueux.jQuery valeur d'entrée indéfinie après l'ajout

J'essaie d'affecter des données de réponse - extraites d'une requête AJAX en utilisant le plugin jquery.autocomplete - à un élément d'entrée. Je peux récupérer les données de réponse, mais quand j'essaie de l'insérer dans l'attribut 'value', rien ne se passe!

$('#btnPopulate').click(function() { 
if ($('#list_length').val() != '') { 
    var length = $('#list_length').val(); 
    var row=''; 
    for (var i=0; i <= length; i++) { 
     row="<tr><td>"+i+"</td><td><input name='data[CompanyRanking]["+i+ 
     "][company_id]' id='CompanyRanking"+i+ 
     "CompanyId' value='1'></td><input type='hidden' name='data[CompanyRanking]["+i+ 
     "][ranking]' id='CompanyRanking"+i+"Ranking' value='"+i+"'></tr>"; 
     $('#ranking_table').append(row); 
     $("CompanyRanking"+i+"CompanyId").autocomplete({ 
      serviceUrl:'/backend/companies/search', 
      minChars:2, 
      delimiter: null, // regex or character 
      maxHeight:400, 
      width:300, 
      deferRequestBy: 50, //miliseconds 
      // callback function: 
      onSelect: function(value, data){ 
       alert('You selected: ' + value + ', ' + data); 
           $('#CompanyRanking'+i+'CompanyId').val(data); 
       alert('val: '+ 
          $('#CompanyRanking'+i+ 
          'CompanyId').val() + 'object?: '+ 
          $('#CompanyRanking'+i+'CompanyId')); 
       } 
     }); 
      }; 
    //$('#btnPopulate').ac; 
    } else { 
    alert('You must first specify how many companies are in the list.'); 
}; 
    return false; 
}); 
+0

J'ai réduit un peu plus la source de cette erreur. Il semble que la variable de boucle 'i' ne soit pas utilisée correctement dans la fonction 'onSelect'. Cette fonction est appelée lorsque l'utilisateur entre des données dans le champ de saisie et que 'i' est défini sur le nombre maximal de boucles, par opposition à l'élément spécifique que j'essaie de sélectionner. – gomezuk

Répondre

2

Il semble être un problème de portée. Essayez de créer une fermeture autour de la valeur de i dans la boucle:

onSelect: (function(i) { 
    return function(value, data){ 
     $('#CompanyRanking'+i+'CompanyId').val(data); 
    } 
}(i)) 

Une meilleure explication peut être trouvée in this answer:

Le problème que vous avez ici est que les changements d'éléments variables avec chaque boucle. Lorsque vous référencez un élément à un point ultérieur , la dernière valeur qu'il contient est utilisée. Vous pouvez utiliser une technique appelée fermeture (essentiellement une fonction qui renvoie une fonction) pour étendre rapidement la variable différemment.

+0

MERCI! Tu m'as sauvé beaucoup de frustration. – gomezuk

2

Il semble que vous essayez d'alerter une valeur de texte et non la valeur elle-même.

alert('val: '+$('#CompanyRanking'+i+'CompanyId').text() + 'object?: '+$('#CompanyRanking'+i+'CompanyId')); 

pourrait peut-être changé à:

alert('val: '+$('#CompanyRanking'+i+'CompanyId').val() + 'object?: '+$('#CompanyRanking'+i+'CompanyId')); 
+0

Merci pour la réponse. J'ai aussi essayé ça. Le .val() renvoie toujours 'undefined'. J'ai mis à jour le post original pour que cela ait plus de sens. – gomezuk

Questions connexes