2010-10-22 11 views
10

J'ai une fonction de CFC ColdFusion comme ceci:Comment envoyer une variable de tableau à une méthode distante ColdFusion CFC via ajax en utilisant jQuery?

<cffunction access="remote" name="getResults" 
    returntype="struct" 
    returnformat="JSON" 
    output="no"> 

    <cfargument name="q" required="true" type="array" /> 

... 
</cffunction> 

Comment appeler cette fonction de jQuery? Aucune forme de codage de tableau par jQuery n'obtiendra à ColdFusion de voir la valeur en tant que tableau.

Si vous passez "q = a & q = b" (comme avec jQuery.ajaxSettings.traditional = true), la fonction obtiendra la chaîne "a, b", pas un tableau. Si la séparation sur virgule peut sembler une possibilité, elle ne fonctionnera pas si l'une des valeurs "q" contient une virgule. De même, idéalement, la fonction côté serveur ne devrait pas avoir à connaître les problèmes de sérialisation des données sur le réseau et devrait continuer à intégrer un tableau.

Si vous transmettez "q [] = a & q [] = b" (valeur par défaut de jQuery), il ne sera pas mappé sur le paramètre "q". Si vous essayez de changer le nom du paramètre "q" en "q []", le CFC va faire une erreur en raison d'un nom de paramètre invalide.

Répondre

8

La première chose à savoir est jQuery Ajax requests do not encode arrays so have you to use something else to encode the data (c'est là jquery.JSON.js provient de référence au dessous de). Donc, avec un JSON encodé y trouve, je puis compris la syntaxe correcte en travaillant avec cfajaxproxy et étudier l'URL qu'il génère dans Firebug:

http://localhost/remote.cfc?method=getResults&argumentCollection=%7B%22q%22%3A%5B1%2C2%5D%7D

Oui l'approche « argumentcollection » est correct, et la variable "q" avec une référence à un tableau est là.

J'ai utilisé le code suivant comme un banc d'essai:

remote.cfc

<cfcomponent output="false"> 
    <cffunction access="remote" name="getResults" 
     returntype="struct" 
     returnformat="JSON" 
     output="no"> 

     <cfargument name="q" required="true" type="array" /> 

     <cfreturn {a=1,b=2}> 
    </cffunction> 
</cfcomponent> 

remote.cfm pour voir comment cfajaxproxy génère son URL

<cfajaxproxy cfc="Remote" jsclassname="Remote"> 
<cfoutput> 
<script language="javascript" type="text/javascript"> 
var oRemote = new Remote(); 
alert(oRemote.getResults([1,2])); 
</script> 
</cfoutput> 

éloigné.html faire avec jQuery

<script language="javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script> 
<script language="javascript" src="jquery.JSON.js"></script> 
<script language="javascript" type="text/javascript"> 
var argumentCollection = { q: [1,2] }; 
$.ajax({ 
    url:  'remote.cfc', 
    data:  { 
     method: 'getResults', 
     argumentCollection: $.JSON.encode(argumentCollection) 
    }, 
    success: function(response) { 
     alert(response); 
    }, 
    dataType: 'json' 
}); 

</script> 
+0

Eh bien, je dirais que jQuery encode les tableaux, mais pas d'une manière que ColdFusion peut accepter. Par défaut dans jQuery 1.4.3, les tableaux sont codés de manière compatible avec PHP et Ruby on Rails, en fournissant plusieurs paramètres, avec un nom de paramètre qui ajoute "[]" au nom de la variable. En utilisant le paramètre "traditionnel", il les code de la même manière qu'un formulaire HTML pour plusieurs cases à cocher, en n'envoyant que plusieurs paramètres. Votre approche pour comprendre cela correspondait à la mienne. Merci pour l'exemple de code détaillé! – jrduncans

+0

Je vais avoir des problèmes similaires aujourd'hui en postant de Angular 4 à CF10. le contournement 'argumentCollection' fonctionne toujours. Envoyer un tableau JSON en tant qu'argument de formulaire ne le fait pas. Il est à noter que le changement du type CFC Argument de 'array' à' any' permettra au code CFC de traiter l'argument en tant que tableau avec la fonction argumentCollection. – JeffryHouser

-1

Que diriez-vous de vérifier vos valeurs pour les virgules et les échapper avant de passer à Coldfusion, puis utilisez ListToArray pour convertir et (si nécessaire) ré-encoder les virgules?

+0

Idéalement, la fonction CFC ne devrait pas avoir à changer, de sorte qu'il peut être appelé sur le côté serveur d'une façon normale. J'ai mis à jour la question pour clarifier cela. – jrduncans

+0

Compris, on dirait que vous avez trouvé une bonne solution. –

6

enquête ce problème, j'ai trouvé le billet de blog suivant: http://www.coldfusionjedi.com/index.cfm/2010/3/23/Using-jQuery-to-post-an-array-to-a-ColdFusion-Component - Cela suggère codant pour le tableau en tant que chaîne JSON, et désérialisation ensuite à l'intérieur de la méthode de CFC, l'impact malheureux d'exiger la fonction CFC devoir changer pour faire face à JSON.

Donc, j'ai étudié plus loin, et voici la meilleure solution que j'ai trouvé jusqu'à présent. En examinant les appels HTTP effectués lors de l'utilisation de cfajaxproxy, j'ai découvert que vous pouviez envoyer un seul paramètre argumentCollection en tant que chaîne JSON pour appeler la méthode CFC distante.

Ainsi, l'appel côté client ressemble à quelque chose comme ceci (en utilisant le plugin jquery-JSON pour faire la sérialisation):

var params = {q: ['a', '1,2,3']}; 

$.getJSON('My.cfc?method=getResults', {argumentCollection: $.toJSON(params)}, function(data) { 
// handle data 
}); 
+0

psst ... Je pense que vous avez laissé tomber un ']' quelque part. –