2010-05-24 8 views
1

J'essaye d'écrire un plugin jQuery, qui peut être appliqué à un sélecteur. Dans ce plugin, il y a plusieurs appels aux webservices, où des méthodes de rappel sont requises.Passer des variables à des fonctions de rappel

Le problème que je rencontre est de maintenir l'élément de contexte actuel dans chaque boucle du sélecteur.

(function($){ 
    $.fn.myMethod = function(){ 

    return this.each(function(){ 
     var c = $(this); 
     $.api.methodToCall("", CallbackFunction); 
    }); 

    }; 

    function CallbackFunction(data, result){ 
    // do stuff based on c 
    } 
})(jQuery); 

Normalement, vous fournirais immédiatement la fonction de rappel, ce qui me permet d'accéder à c, mais dans la fonction de rappel, il y a potentiellement un autre appel api, il commencerait à se salir. Est-ce qu'il y a un moyen de faire ça?

Répondre

1

ÉDITÉ

Comme Sean a souligné, ma première édition a été un peu plus compliqué que la situation requise ...

$.api.methodToCall("", function(data, result) { 
    CallbackFunction(data, result, context); 
}); 

function CallbackFunction(data, result, c) { 
    // you can access 'c' here... 
} 

Ou, si vous préférez

$.api.methodToCall("", function(data, result) { 
    CallbackFunction.call(c, data, result); 
}); 

function CallbackFunction(data, result) { 
    // you can access 'this' here... 
} 
+0

La fonction appelée immédiatement n'est pas nécessaire ici car il n'y a pas d'itération avec les variables partagées en cours. –

+1

@Sean Kinsey: ah, vous avez raison, c'était trop compliqué. édité. J'ai attribué +1 à vous, et gardez mes exemples pour illustrer que le rappel peut être extrait à une fonction séparée (pour la lisibilité, par exemple), et toujours avoir une référence au contexte, qui je crois était le noyau de la question. –

1

C'est l'approche la plus simple

(function($) { 
    $.fn.myMethod = function() { 
     return this.each(function() { 
      var c = $(this); 
      $.api.methodToCall("", function() { 
       // do stuff based on c 
      }); 
     }); 
    }; 
})(jQuery); 

Ici, nous apportons la fonction de rappel dans la portée locale, et donc il a directement accès à c.