2010-08-07 6 views
25

J'essaie d'utiliser jQuery pour appeler une API personnalisée via Ajax/$.getJSON.

J'essaie de transmettre une valeur personnalisée dans la méthode de rappel Ajax, mais cette valeur n'est pas transmise et est en fait écrasée. Ceci est mon code:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 

$("#loading_status").show(); 

$.getJSON(url, null, function(results, locationType) { 
    searchResults(results, locationType) 
}); 

La valeur de locationType avant d'appeler l'URL en utilisant AJAX est 3. Mais après que l'appel a correctement renvoyé les données, la valeur locationType est maintenant success. En effet, le method signature of the callback est:

rappel (données, textStatus) Une fonction de rappel qui est exécutée si la demande réussit.

Comment puis-je transmettre 1 ou plusieurs paramètres à une méthode de rappel?

+0

variable locationType est variable globale de sorte que vous n'avez pas besoin de le mettre en paramètre, en fonction de rappel Anonimus cette variable est libre il est donc recherche dans environnement qui dans ce cas est environnement global. – jcubic

+1

@jcubic - Ce n'est pas une variable * globale * (enfin c'est peut-être le cas, mais probablement pas), plus précisément, elle est disponible dans la portée qui l'intéresse. –

Répondre

19

Vous n'avez pas besoin de passer, juste au cas référencer la variable que vous avez déjà, comme ceci:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 
$("#loading_status").show(); 
$.getJSON(url, null, function(results) { 
    searchResults(results, locationType) 
}); 

il n'y a pas non plus besoin de passer null si vous ne disposez pas d'un objet de données, il est un paramètre optionnel et vérifie jQuery si le second est une fonction param ou non, vous pouvez simplement faire ceci:

$.getJSON(url, function(results) { 
    searchResults(results, locationType) 
}); 
+17

Vous devez faire attention avec ceci. Pour une variable à valeur fixe, cela est utile, mais si vous essayez de le faire, par exemple, dans une boucle où emplacementType est l'index, sa valeur dans le rappel sera la valeur au moment de l'exécution du rappel, pas la valeur à définition. Au cas où! –

+0

@DanibISHOP: Et comment voulez-vous passer une valeur non fixée? – Espen

+0

Les valeurs non fixes peuvent être utiles si vous effectuez beaucoup d'appels d'API et avez ensuite besoin de savoir quel appel provient de quel ID vous chargez – mitchken

2

Si vous souhaitez utiliser locationType (dont la valeur est 3) dans le rappel, utilisez simplement

function(results) { ..... 

grâce à closures, locationType sera automatiquement disponible dans le rappel.

18

Warp dans une fonction, par ex.

function getResults(locationType) { 
    $.getJSON(url, null, function(results) { 
     searchResults(results, locationType) 
    }); 
} 

Mais dans votre situation spécifique, vous n'avez même pas à le transmettre, vous pouvez accéder à la valeur directement dans le rappel.

+3

si vous faites une boucle et que vous appelez $ .getJSON() à chaque fois, en l'enveloppant une fonction conservera la variable; sinon, il sera remplacé. – yee379

3

vous pouvez utiliser la méthode .ajax:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 
$.ajax({ 
    url: url, 
    context: { lt: locationType }, 
    success: function(results) { 
     searchResults(results, this.lt);  
    } 
}); 
+0

Je crois qu'il y a une erreur dans le code ci-dessus. Lorsque vous utilisez le paramètre de contexte, "this" devient le contexte dans la fonction de rappel, donc le code doit lire searchResults (results, this.lt); au lieu de searchResults (résultats, this.context.lt) ;. J'ai déjà fait la correction ci-dessus. –

0

tenteraient:

function getResults(locationType) { 
    $.getJSON(url, {p1:'xxx', p2: 'yyy'}, function(results) { 
     searchResults(results, locationType) 
    }); 
} 
Questions connexes