2010-08-07 17 views
25

Sto provando a utilizzare jQuery per chiamare alcune API personalizzate tramite Ajax/$.getJSON.

Sto provando a passare un valore personalizzato nel metodo di callback Ajax, ma quel valore non viene passato e viene effettivamente sovrascritto. Questo è il mio codice:

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

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

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

Il valore di locationType prima che chiami l'URL utilizzando AJAX è 3. Ma dopo che la chiamata ha restituito i dati correttamente, il valore per locationType è ora success. Questo perché il method signature of the callback è:

callback (dati, textStatus) Un funzione di callback che viene eseguita se la richiesta riesce.

Come posso passare 1 o più parametri a un metodo di richiamata?

+0

variabile LocationType è variabile globale in modo non è necessario per dirla come parametro, in funzione di callback anonima quella variabile è libero ed è quindi ricerca in un ambiente circostante che in questo caso è ambiente globale. – jcubic

+1

@jcubic - Non è una variabile * globale * (beh, potrebbe essere, ma probabilmente no), più precisamente è disponibile nel campo di applicazione di cui è preoccupato. –

risposta

19

Non è necessario passare in, basta fare riferimento alla variabile che già avete, in questo modo:

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

Inoltre non c'è bisogno di passare null se non si dispone di un oggetto di dati, è un parametro facoltativo e controlla jQuery se il secondo parametro è una funzione o meno, quindi si può solo fare questo:

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

Devi stare attento a questo. Per una variabile a valore fisso questo è utile, ma se si tenta di farlo, ad esempio, all'interno di un ciclo in cui locationType è l'indice, il suo valore all'interno del callback sarà il valore al momento dell'esecuzione del callback, non il valore su definizione. Nel caso in cui! –

+0

@ Danibishop: E come passeresti senza un valore fisso? – Espen

+0

valori non fissi potrebbero essere utili se si eseguono molte chiamate API e quindi si deve ancora sapere quale chiamata ha avuto origine da quale ID si sta caricando – mitchken

2

Se si desidera utilizzare locationType (il cui valore è 3) nella richiamata, è sufficiente utilizzare

function(results) { ..... 

grazie alla closures, locationType saranno automaticamente disponibili nella callback.

18

Ordinare in una funzione, ad es.

Ma in una situazione specifica non è nemmeno necessario passarlo, è possibile accedere al valore direttamente nella richiamata.

+3

se si esegue un ciclo e si chiama $ .getJSON() ogni volta, quindi il wrapping di una funzione preserverà la variabile; altrimenti, verrà sovrascritto. – yee379

3

è possibile utilizzare il metodo .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

Credo che ci sia un errore nel codice sopra. Quando si utilizza l'impostazione del contesto, "questo" diventa il contesto nella funzione di callback, quindi il codice dovrebbe leggere searchResults (results, this.lt); invece di searchResults (risultati, this.context.lt) ;. Ho già fatto la correzione sopra. –

0

potrebbe provare:

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