$.ajax ColdFusion cfc JSON Ciao Mondo
-
23-09-2019 - |
Domanda
Ho semplificato questo esempio per quanto mi è possibile.Ho una funzione di controllo remoto:
<cfcomponent output="false">
<cffunction name="Read" access="remote" output="false">
<cfset var local = {}>
<cfquery name="local.qry" datasource="myDatasource">
SELECT PersonID,FirstName,LastName FROM Person
</cfquery>
<cfreturn local.qry>
</cffunction>
</cfcomponent>
E utilizzando jQuery $.ajax metodo, vorrei fare una lista non ordinata di tutti.
<!DOCTYPE HTML>
<html>
<head>
<script src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("jquery", "1");
</script>
<script type="text/javascript">
jQuery(function($){
$.ajax({
url: "Remote/Person.cfc?method=Read&ReturnFormat=json",
success: function(data){
var str = '<ul>';
// This is where I need help:
for (var I=0; I<data.length; I++) {
str += '<li>' + I + data[I][1]+ '</li>'
}
str += '</ul>';
$('body').html(str);
},
error: function(ErrorMsg){
console.log("Error");
}
});
});
</script>
</head>
<body>
</body>
</html>
La parte in cui mi sono perso, dove sto loop sui dati.Io preferisco l'uso di jQuery $.ajax metodo perché capisco che $.ottenere e $.post, non hanno la registrazione degli errori.
Non so come gestire JSON restituito dalla cfc.
Soluzione
Sembra che il risultato è in formato JSON (controllare i documenti http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_f_21.html ). "Se si specifica returnformat =" JSON "e la funzione restituisce una query, ColdFusion serializza la query in un oggetto JSON con due voci, e la matrice di nomi di colonne, e un array di array di dati di colonna. Per ulteriori informazioni vedere SerializeJSON." http://livedocs.adobe.com/coldfusion/8 /htmldocs/help.html?content=Tags_f_21.html
Così il primo array (data.COLUMNS dovrebbe essere un array di nomi di colonne. Data.COLUMNS [0] si darebbe il nome della prima colonna. Data.DATA [0] darebbe la prima riga della query .
Un bel trucco è quello di utilizzare console.log (dati) in consolle cromato o Firebug per visualizzare i dati nella sua forma strutturata.
non ho la prova questo, ma dovrebbe essere vicino. Basta generare una tabella di base dai dati.
$.ajax({
url: 'Remote/Person.cfc?method=Read&ReturnFormat=json',
dataType: 'json',
success: function(response) {
var str = '<table><tr>';
var i;
var j;
//loop over each column name for headers
for (i = 0; i < response.COLUMNS.length; i++) {
str += '<th>' + response.COLUMNS[i] + '</th>';
}
}
str += '</tr>';
//loop over each row
for (i = 0; i < response.DATA.length; i++) {
str += '<tr>';
//loop over each column
for (j = 0; j < response.DATA[i].length; j++) {
str += '<td>' + response.DATA[i][j] + '</td>';
}
str += '</tr>';
}
str += '</table>';
$('body').html(str);
},
error: function(ErrorMsg) {
console.log('Error');
}
});
Altri suggerimenti
Il modo più semplice sarebbe quella di vedere visivamente come i dati JSON restituiti è strutturata. Allora non dovrebbe essere troppo difficile trasversali dell'oggetto JS. Hai provato JSON visualizzazione? http://chris.photobooks.com/json/default.htm
Se tutto ciò che serve è il PersonID, è possibile restituire array o lista di PersonID da CF pure.
o, in alternativa, si può chiedere di tornare CF testo semplice, con di tutto il <li>
generato. Il messaggio passato attraverso l'Ajax sarà più grande, ma dovrete meno codice JS da mantenere. CFML è più facile da mantenere, giusto? :)
Io non sono molto familiare con ColdFusion ma avete provato a fissare il tipo di dati JSON?
$.ajax({
url: 'Remote/Person.cfc?method=Read&ReturnFormat=json',
dataType: 'json',
success: function(response) {
var data = response.DATA;
var str = '<ul>';
for (var I = 0; I < data.length; I++) {
str += '<li>' + I + data[I][1] + '</li>';
}
str += '</ul>';
$('body').html(str);
},
error: function(ErrorMsg) {
console.log('Error');
}
});
Che dovrebbe funzionare se i dati che stai ricevendo indietro assomiglia a qualcosa del tipo:
[["PersonID1", "FirstName1", "LastName1"],["PeronID2", "FirstName2", "LastName2"]] .. etc
Se quanto sopra non funziona se si potesse mostrare i dati grezzi JSON di essere restituito dalla vostra richiesta dovrei essere in grado di risolvere facilmente.
Inoltre, non so se era nel codice, ma è mancato un punto e virgola alla fine della riga nel ciclo for.
Opzioni :
Nel tuo caso metterei
<cffunction name="keywordAutoComplete" access="remote"
returntype="struct" returnformat="JSON" >
MA
questa non è la stessa cosa returntype="string" returnformat="plain" + <cfreturn serializeJSON(query) >
e questo è un problema di modulo jQuery punto di vista, perché si ottiene brutto JSON anche se si utilizza serializeJSON srerialization da colonne.
- È possibile effettuare una stringa JSON manualmente attraverso cfloop e la concatenazione :/
- Utilizzare cfjson.cfc che sostituisce serializeJSON
- Vai a Ben Nadel sito e prendere il suo metodo toJSON e modificarlo in qualche modo a soddisfare le vostre esigenze
Altra cosa è serializeJSON, restituisce uppercased chiavi, in modo da prestare attenzione, utilizzare lcase() o write .INQUESTOMODO in js.
PS:Prova questo per la dinamica creaiton di html in jQuery:
var someLiElement = $('<li />').addClass('custom_class')
.text('Foo bar')
.attr('id', 'custom_id' + someInteger)
poi aggiungi metodo di elemento padre