2010-04-08 15 views
5

Devo restituire più valori da una funzione ColdFusion in una funzione di callback ajax. Ecco quello che ho:Restituzione di due o più valori da una funzione

$('input[name="StateName"]').live('change', function() { 
    var StateID = $(this).parents('tr').attr('id'); 
    var StateName = $(this).val(); 
    $.ajax({ 
     url: 'Remote/State.cfc' 
     ,type: "POST" 
     ,data: { 
      'method': 'UpdateStateName' 
      ,'StateID': StateID 
      ,'StateName': StateName 
     } 
     ,success: function(result){ 
      if (isNaN(result)) { 
       $('#msg').text(result).addClass('err'); 
      } else { 
       $('#' + result + ' input[name="StateName"]').addClass('changed'); 
      }; 
     } 
     ,error: function(msg){ 
      $('#msg').text('Connection error').addClass('err'); 
     } 
    }); 
}); 

Se io intercettare un errore del database, quindi il callback successo viene licenziato, e il risultato non è un numero (Si tratta, infatti, il testo del messaggio di errore). Ho bisogno che la funzione passi anche altri valori. Uno potrebbe essere la chiave principale della riga che ha causato l'errore. Un altro potrebbe essere il vecchio StateName, in modo che possa aggiornare il vecchio valore sullo schermo in modo che il client sappia assolutamente che il cambiamento non ha avuto effetto.

Immagino di infrangere la regola di atomicità qui e devo correggerla, perché sto usando il risultato sia come chiave primaria della riga che è stata aggiornata, o è il messaggio di errore se l'aggiornamento fallisce. Devo restituire sia la chiave primaria che il messaggio di errore.

risposta

6

La funzione remota potrebbe restituire una stringa **JSON **, contenente un oggetto, suppongo.

Permetterebbe di avere più valori all'interno di un singolo "valore".

E JSON è una notazione di oggetti Javascript, è piuttosto semplice da leggere in Javascript - e ci sono librerie per serializzare i dati su JSON in molte lingue.


Ad esempio, ecco una stringa JSON:

{"status":1,"message":"this is a message","data":{"test":"plop","hello":"world"}} 

Questo corrisponde ad un oggetto con 3 proprietà:

  • status
  • message
  • e data; che è a sua volta un altro oggetto, che contiene due proprietà.

Il ritorno di questo tipo di stringa dalla tua chiamata AJax non dovrebbe essere troppo difficile - e questo è un sistema abbastanza flessibile e molto potente.

+0

Grazie Pascal Martin! OK, ho modificato il risultato in: {"STATEID": 101.0, "MSG": "Hello World"}, ma ora come posso risolvere result.msg? È risultato.DATA.msg o qualcosa del genere? –

+0

Prego :-) Poiché stai usando jQuery, dovresti dare un'occhiata a http://api.jquery.com/jQuery.ajax/; l'opzione 'dataType' sembra interessante, dato che puoi impostarla su' json'; e, quindi, la callback 'success' dovrebbe ricevere direttamente un oggetto Javascript ;; quale mi piacerebbe qualcosa come 'result.STATEID',' result.MSG', ... –

+0

Sì, stavo usando result.msg quando avrei dovuto usare result.MSG. Arg! Chi ha razionalizzato l'uso di un linguaggio informatico sensibile al maiuscolo e minuscolo? Non sanno che sono tutti gli 1 e gli 0 !! –

4

Faccio tutte le richieste ajax restituire lo stesso tipo di oggetto. Lo schema che utilizzo è piuttosto comune: il mio oggetto risposta è sempre costituito da un flag Success, una proprietà Data e una collezione Errors.

Se jsonify un oggetto del genere e lo si restituisce per tutte le richieste Ajax, è sempre possibile determinare se la richiesta ha avuto esito positivo, quali sono stati gli errori (se presenti) e se ha avuto esito positivo, si avrà il dati risultanti. In questo modo, sarai sempre in grado di gestire le tue risposte in modo coerente.

Si noti che la raccolta Errors sarebbe errori di business logic - gli errori effettivi del server avrebbero comunque attivato il gestore degli errori jQuery. Ma utilizzando l'oggetto di cui sopra, la funzione "successo" sembra più:

if (!result.Success) { 
    $('#msg').text(result.Errors[0]).addClass('err'); 
} else { 
    $('#' + result.Data + ' input[name="StateName"]').addClass('changed'); 
}; 
+0

+1 per avere un consistente convenzione – Antony

1

È possibile tornare stringa XML e poi accedervi in ​​funzione di successo:

success:function(data) 
{ 
    var err_code,err_msg; 
    //read err_code and err_msg: 
    // we need 2 different handlers for IE and all other browsers. 
      if (! $.browser.msie) 
      { 
       // this code surprisingly doesn't work with IE. 
       err_code = $('error_code:first',data).text(); 
       err_msg = $('error_message:first',data).text(); 
      } 
      else 
      { 
       var xml = new ActiveXObject("Microsoft.XMLDOM"); 
       xml.async = false; 
       xml.loadXML(data); 
       err_code = xml.documentElement.getElementsByTagName('error_code')[0].text;      
       err_msg = xml.documentElement.getElementsByTagName('error_message')[0].text; 
      } 

} 
Problemi correlati