2010-08-07 13 views
25

Estoy tratando de usar jQuery para llamar a algunas API personalizadas a través de Ajax/$.getJSON.

Estoy tratando de pasar un valor personalizado en el método de devolución de llamada Ajax, pero ese valor no se transfiere y en realidad se sobrescribe. Este es mi código:

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

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

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

El valor de locationType antes de llamar a la URL usando AJAX es 3. Pero después de que la llamada devuelve los datos correctamente, el valor de locationType ahora es success. Esto se debe a la method signature of the callback es:

de devolución de llamada (datos, textStatus) Un función de llamada que se ejecuta si la petición tiene éxito .

¿Cómo puedo pasar 1 o más parámetros a un método de devolución de llamada?

+0

variables locationType es variable global, de modo que no es necesario ponerlo como parámetro, en función de devolución de llamada anonimus esa variable es gratis, así que es la búsqueda en el entorno circundante, que en este caso es entorno global. – jcubic

+1

@jcubic - No es una variable * global * (bueno, podría ser, pero probablemente no), con mayor precisión está disponible en el alcance que le preocupa. –

Respuesta

19

No es necesario pasarlo adentro, apenas referencia a la variable que ya tiene, como esto:

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

también que no hay necesidad de pasar null si usted no tiene un objeto de datos, es un parámetro opcional y controles jQuery si el segundo parámetro es una función o no, por lo que sólo puede hacer esto:

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

Debe tener cuidado con esto. Para una variable de valor fijo esto es útil, pero si intenta hacer esto, por ejemplo, dentro de un bucle donde locationType es el índice, su valor dentro de la devolución de llamada será el valor en el momento de la ejecución de la devolución de llamada, no el valor en definición. ¡Por si acaso! –

+0

@DanibISHOP: ¿Y cómo pasaría un valor no fijo? – Espen

+0

valores no fijos pueden ser útiles si realiza muchas llamadas API y aún necesita saber qué llamada se originó a partir de qué ID está cargando – mitchken

2

Si desea utilizar locationType (cuyo valor es 3) en la devolución de llamada, basta con utilizar

function(results) { ..... 

gracias a closures, locationType estarán disponibles automáticamente en la devolución de llamada.

18

deformación en una función, p.

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

Pero en situación específica que no tienen ni siquiera para pasarlo, se puede acceder al valor directamente en la devolución de llamada.

+3

si está haciendo un ciclo y llamando a $ .getJSON() cada vez, al envolverlo en una función se conservará la variable; de lo contrario, será anulado. – yee379

3

se puede utilizar el método de .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

Creo que hay un error en el código anterior. Al usar la configuración del contexto, "this" se convierte en el contexto en la función de devolución de llamada, por lo que el código debe leer searchResults (results, this.lt); en lugar de searchResults (results, this.context.lt) ;. Ya hice la corrección anterior. –

0

podría intentar:

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