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.

È stato utile?

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.

  1. È possibile effettuare una stringa JSON manualmente attraverso cfloop e la concatenazione :/
  2. Utilizzare cfjson.cfc che sostituisce serializeJSON
  3. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top