Comment passer un élément à jQuery publier dans une boucle

J'ai le code suivant:

for (_field in _fields) { $.post( '/api/fields', { id: _field.id }, function(data, _field) { alert(data); } (data, _fields[_field) ); } 

Je dois passer l' _fields[_field] à la fonction qui renvoie les données de jQuery parce qu'il perd la référence à l'objet droit pendant la boucle. Le problème est qu'en définissant que la fonction de post doit avoir un paramètre _field , vous devez également spécifier un paramètre pour les données, ou les données seront écrasées avec _field .

Les données actuelles ne sont pas undefined parce que je n'ai pas d'objet de données défini dans la boucle. J'ai également essayé de passer en null , mais cela renvoie tout simplement null . Je recherche un moyen de passer l'élément sans écraser les données renvoyées par la fonction de publication.

Existe-t-il un moyen de résoudre ce problème, ou peut-être une autre méthode jQuery qui peut faire ce qui est nécessaire?

Vous voulez une fonction factory factory – une fonction qui crée une fonction:

 for (_fieldName in _fields) { $.post('/api/fields', { // Unrelated, but I think this bit is wrong; shouldn't it be // `id: _fields[_fieldName].id` ? You're trying to use `.id` on // a string -- see below for a full update id: _fieldName.id }, makeHandler(_fields[_fieldName]) ); } function makeHandler(field) { return function(data) { // Use `data` and `field` here }; } 

Notez que dans l'initialiseur d'objet, nous passons à $.post , nous appelons makeHandler pour qu'il s'exécute et renvoie la fonction que nous passons à $.post . Cette fonction est alors appelée lorsque le $.post terminé et a accès à l'argument de data que $.post lui donne aussi bien que l'argument de field pour makeHandler , car il s'agit d'une fermeture sur le contexte de l'appel à makeHandler , qui inclut le Argument de field . Plus: les fermetures ne sont pas compliquées


Notez que dans le code ci-dessus, j'ai changé votre variable _field à _fieldName pour être plus clair: la variable dans les boucles for..in est une chaîne, le nom d'une propriété. Voir aussi le commentaire, je pense que vous essayez d'utiliser .id au mauvais endroit. Voici ce que je pense que vous vouliez vraiment:

 for (_fieldName in _fields) { _field = _fields[_fieldName]; $.post('/api/fields', { id: _field.id }, makeHandler(_field) ); } function makeHandler(field) { return function(data) { // Use `data` and `field` here }; } 

Notez également que si _fields est un tableau, vous ne devriez pas utiliser pour for..in sans sauvegarde. Plus: Mythes et réalités de for..in