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