2010-04-08 4 views
5

Je dois retourner plusieurs valeurs d'une fonction ColdFusion dans une fonction de rappel ajax. Voici ce que j'ai:Renvoyer plusieurs valeurs d'une fonction

$('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 je piège une erreur de base de données, puis le rappel de succès est tiré, et le résultat est un numéro (Il est en fait, le texte du message d'erreur). J'ai besoin de la fonction pour également repasser d'autres valeurs. L'un pourrait être la clé primaire de la ligne qui a causé l'erreur. Un autre pourrait être l'ancien StateName, de sorte que je puisse actualiser l'ancienne valeur sur l'écran afin que le client sache absolument pour sûr que leur changement n'a pas pris effet. Je suppose que je casse ici la règle de l'atomicité et que je dois y remédier, car j'utilise le résultat comme clé primaire de la ligne qui a été mise à jour, ou le message d'erreur si la mise à jour échoue. Je dois retourner à la fois la clé primaire et le message d'erreur.

Répondre

6

Votre fonction à distance pourrait retourner une chaîne **JSON **, contenant un objet, je suppose.

Cela vous permettrait d'avoir plusieurs valeurs dans une seule "valeur". Et JSON étant Javascript Object Notation, il est assez facile de le lire en Javascript - et il y a des bibliothèques pour sérialiser les données en JSON dans beaucoup de langues.


Par exemple, voici une chaîne JSON:

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

Cela correspond à un objet avec 3 propriétés:

  • status
  • message
  • et data; qui est lui-même un autre objet, qui contient deux propriétés.

Renvoyer ce type de chaîne à partir de votre appel AJax ne devrait pas être trop difficile - et c'est un système assez flexible et vraiment très puissant.

+0

Merci Pascal Martin! OK, j'ai changé le résultat pour être: {"STATEID": 101.0, "MSG": "Bonjour tout le monde"}, mais maintenant comment adresse-je result.msg? Est-ce result.DATA.msg ou quelque chose? –

+0

De rien :-) Comme vous utilisez jQuery, vous devriez jeter un oeil à http://api.jquery.com/jQuery.ajax/; l'option 'dataType' semble intéressante, car vous pouvez la définir sur' json'; et, alors, votre callback «succès» devrait recevoir directement un objet Javascript ;; ce qui veut dire quelque chose comme 'result.STATEID',' result.MSG', ... –

+0

Ouais, j'utilisais result.msg alors que j'aurais dû utiliser result.MSG. Arg! Qui a rationalisé l'utilisation d'un langage informatique sensible à la casse? Ne savent-ils pas que tout est à 1 et à 0? –

4

Je fais que toutes mes requêtes ajax renvoient le même type d'objet. Le modèle que j'utilise est assez commun - mon objet de réponse est toujours constitué d'un drapeau Success, d'une propriété Data et d'une collection Errors. Si vous jsonifiez un objet comme celui-ci et que vous le renvoyez pour toutes vos requêtes ajax, vous pouvez toujours déterminer si la requête a réussi, quelles ont été les erreurs (le cas échéant) et si elle a réussi, données résultantes. De cette façon, vous serez toujours capable de gérer vos réponses de manière cohérente.

Notez que la collection Errors correspond à des erreurs de logique métier: des erreurs de serveur réelles déclenchent toujours le gestionnaire d'échec jQuery. Mais en utilisant l'objet ci-dessus, votre fonction « succès » ressemble plus:

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

+1 pour avoir une convention cohérente – Antony

1

Vous pouvez retourner la chaîne xml et y accéder en fonction de la réussite:

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

} 
Questions connexes