2010-04-08 8 views
5

Necesito devolver varios valores de una función ColdFusion en una función de devolución de llamada ajax. Esto es lo que tengo:Devolviendo dos o más valores desde una función

$('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'); 
     } 
    }); 
}); 

Si trampa de un error de base de datos, entonces la devolución de llamada de éxito se dispara, y el resultado no es un número (Es, de hecho, el texto del mensaje de error). Necesito la función para pasar también otros valores. Uno podría ser la clave principal de la fila que causó el error. Otro podría ser el antiguo StateName, de modo que pueda actualizar el valor anterior en la pantalla para que el cliente sepa absolutamente con certeza que su cambio no surtió efecto.

Supongo que estoy rompiendo la regla de atomicidad aquí y necesito solucionarlo, porque estoy utilizando el resultado como la clave principal de la fila que se actualizó, o es el mensaje de error si la actualización falla. Necesito devolver tanto la clave principal como el mensaje de error.

Respuesta

6

Su función remota podría devolver una cadena **JSON **, que contiene un objeto, supongo.

Le permitiría tener varios valores dentro de un único "valor".

Y JSON es la notación de objetos de Javascript, es bastante fácil de leer en Javascript, y hay bibliotecas para serializar datos a JSON en muchos idiomas.


Por ejemplo, aquí es una cadena JSON:

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

Esto corresponde a un objeto con 3 propiedades:

  • status
  • message
  • y data; que es en sí mismo otro objeto, que contiene dos propiedades.

Devolver este tipo de cadena desde su llamada AJax no debería ser demasiado difícil, y ese es un sistema bastante flexible y realmente proeficiente.

+0

Gracias Pascal Martin! Bien, he cambiado el resultado para que sea: {"STATEID": 101.0, "MSG": "Hola mundo"}, pero ahora ¿cómo me dirijo a result.msg? ¿Es result.DATA.msg o algo así? –

+0

De nada :-) Como está utilizando jQuery, debería echar un vistazo a http://api.jquery.com/jQuery.ajax/; la opción 'dataType' parece interesante, ya que puedes establecerla en' json'; y, entonces, su devolución de llamada 'success' debería recibir directamente un objeto Javascript ;; que me gustaría algo como 'result.STATEID',' result.MSG', ... –

+0

Sí, estaba usando result.msg cuando debería haber estado usando result.MSG. Arg! ¿Quién racionalizó tener un lenguaje de computadora que distingue entre mayúsculas y minúsculas? ¡¿No saben que es todo 1 y 0? –

4

Hago que todas mis peticiones ajax devuelvan el mismo tipo de objeto. El patrón que uso es bastante común: mi objeto de respuesta siempre consiste en una bandera Success, una propiedad Data y una colección Errors.

Si jsonifica un objeto como ese y lo devuelve para todas sus solicitudes ajax, siempre puede determinar si la solicitud fue exitosa, cuáles fueron los errores (si los hubo), y si fue exitosa, tendrá la datos resultantes. De esta manera, siempre podrá manejar sus respuestas de manera consistente.

Tenga en cuenta que la colección Errors sería errores de lógica empresarial; los errores reales del servidor aún desencadenarían el controlador de fallas jQuery. Pero utilizando el objeto anterior, la función de su "éxito" se parece más a:

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

+1 por tener una constante de convenciones – Antony

1

Puede volver cadena XML y luego acceder a ella en función del éxito:

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; 
      } 

} 
Cuestiones relacionadas