2010-05-24 7 views
1

J'ai actuellement un code similaire à cela pour un formulaire:jQuery: Comment traiter « ceci » dans callbacks AJAX

$('#some-form') 
    .submit(function() 
    { 
     // Make sure we are not already busy 
     if($(this).data('busy')) 
      return false; 
     $(this).data('busy', true); 

     // Do post 
     $.post("some/url", $(this).serialize(), function(data) 
     { 
      if(data.success) // Success is a boolean I set in the result on the server 
      { 
       // Deal with data 
      } 
      else 
      { 
       // Display error 
      } 

      $('#some-form') 
       .removeData('busy'); 
     }); 
     return false; 
    }); 

Mon problème est que je voudrais retirer en quelque sorte la nécessité de connaître la forme id dans le rappel de poste. À la fin où je supprime les données busy du formulaire, je voudrais en quelque sorte ne pas avoir codé en dur. Y a-t-il un moyen de le faire? Y at-il un moyen que je peux transmettre ce qui est dans this à la fonction post-callback? Depuis que je connais la carte d'identité en ce moment, je peux la contourner en faisant ce que j'ai fait, mais j'aimerais savoir comment ne pas dépendre de connaître l'identifiant, car souvent je n'ai pas de carte d'identité. (Par exemple, si j'ai un lien dans chaque ligne d'une table et toutes les lignes ont le même gestionnaire de clic.

Répondre

2

Définir une variable avec la valeur « cette » avant de créer la fonction de rappel. Ensuite, utilisez ce nom de variable dans la fonction de rappel.

var form = this; 
$.post("some/url", $(this).serialize(), function(data) { 
     $(form).removeData('busy'); 
} 

cette façon, la variable avec le formulaire sera disponible à l'intérieur du rappel. Lorsque vous déclarez une fonction, cette fonction aura accès à toutes les variables dans ce même champ d'application, même si elle est appelée après que la fonction dans laquelle il a été déclaré est retournée

Vous pouvez lire à propos des fermetures en détail à: http://www.jibbering.com/faq/notes/closures/

+0

semble fonctionner très bien! – Svish

+0

Content d'entendre! :) – baloo

0

Gardez une référence au formulaire.

var form = $("form").submit(function() 
{ 
    // do ajax call here, referencencing the "form" variable 

    return false; // return false to prevent default behavior 
}); 

En général, vous n'aurez qu'un seul élément de formulaire à traiter. Il n'est donc pas nécessaire de créer la référence dans la fonction de soumission, en encapsulant this dans l'objet jQuery.

Voici votre code modifié:

var form = $("#some-form").submit(function() 
{ 
    if(form.data("busy")) return false; 

    form.data("busy", true); 

    $.post("some/url", form.serialize(), function (data) 
    { 
     if (data.success) 
     { 
     } 
     else 
     { 
     } 

     form.removeData("busy"); 
    }); 

    return false; 
}); 
+0

En général, j'ai besoin de cela pour d'autres choses que des formes si. Donc, je ne veux pas garder de références à quoi que ce soit, car il sera assez nombreux et ils seront supprimés et ajoutés et autres. – Svish

0

Utilisez le bind

$('#some-form') 
.submit(function() 
{ 
    // Make sure we are not already busy 
    if($(this).data('busy')) 
     return false; 
    $(this).data('busy', true); 

    // Do post 
    $.post("some/url", $(this).serialize(), function(data) 
    { 
     if(data.success) // Success is a boolean I set in the result on the server 
     { 
      // Deal with data 
     } 
     else 
     { 
      // Display error 
     } 


     $(this).removeData('busy'); 

    }.bind(this)); //Here 
    return false; 
}); 

Vous pouvez trouver l'article intresting à propos de javascript champ: http://www.digital-web.com/articles/scope_in_javascript/ Juste google

+0

Intéressant. Quand j'essaye ceci j'obtiens une erreur disant que la liaison n'est pas une fonction cependant ... – Svish

+0

@mathk: Je pense que vous confondez avec la fonction de bind() de MooTools. La fonction bind() existe dans jQuery, mais n'a pas la même signification: elle est utilisée pour attacher des événements. – mexique1

+0

en fait, je suis confus avec le bind() dans la bibliothèque de prototypes. Pardon – mathk