1

我已经尽可能地简化了这个例子。我有一个远程功能:

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

并使用 jQuery $.ajax 方法,我想制作每个人的无序列表。

    <!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>

我迷路的部分是我循环数据的地方。我更喜欢使用 jQuery $.ajax 方法,因为我知道 $.get 和 $.post 没有错误捕获。

我不知道如何处理从 cfc 返回的 JSON。

4

4 回答 4

8

看起来结果是 json 格式(查看文档http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_f_21.html)。“如果您指定 returnformat="json" 并且函数返回一个查询,ColdFusion 将查询序列化为一个 JSON 对象,其中包含两个条目、列名数组和列数据数组。有关更多信息,请参阅 SerializeJSON。” http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_f_21.html

所以第一个数组(data.COLUMNS 应该是一个列名数组。data.COLUMNS[0] 会给你第一列的名称。data.DATA[0] 会给你查询的第一行。

一个不错的技巧是在 chrome 或 firebug 控制台中使用 console.log(data) 以结构化形式查看数据。

我没有对此进行测试,但它应该很接近。只需从数据中生成一个基本表。

$.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');
    }
});
于 2010-04-05T01:40:12.920 回答
4

我对 ColdFusion 不是很熟悉,但您是否尝试过将数据类型设置为 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');
    }
});

如果您返回的数据类似于以下内容,那应该可以工作:

[["PersonID1", "FirstName1", "LastName1"],["PeronID2", "FirstName2", "LastName2"]] .. etc

如果上述方法不起作用,如果您可以显示请求返回的原始 JSON 数据,我应该能够轻松修复它。

此外,不确定它是否在您的代码中,但您在 for 循环的行尾错过了一个分号。

于 2010-03-31T22:13:22.537 回答
4

最简单的方法是直观地查看返回的 JSON 数据的结构。那么横穿JS对象应该不会太难。您是否尝试过 JSON 可视化?http://chris.photobooks.com/json/default.htm

如果您只需要 PersonID,您也可以从 CF 返回数组或 PersonID 列表。

或者,您可以选择让 CF 返回纯文本,并<li>生成所有 '。通过 ajax 传递的消息会更大,但需要维护的 JS 代码会更少。CFML 更容易维护,对吧?:)

于 2010-03-31T22:21:30.330 回答
2

选项 :

在你的情况下,我会说

<cffunction name="keywordAutoComplete" access="remote" 
            returntype="struct" returnformat="JSON" >

这与 jQuery 的观点相同returntype="string" returnformat="plain" + <cfreturn serializeJSON(query) > ,这是一个问题,因为即使您使用 serializeJSON 按列序列化,您也会得到丑陋的 JSON。

  1. 您可以通过 cfloop 和连接手动制作 JSON 字符串:/
  2. 使用 cfjson.cfc 覆盖 serializeJSON
  3. 访问 Ben Nadel 的网站并采用他的 toJSON 方法并以某种方式对其进行修改以满足您的需求

其他的就是serializeJSON,返回大写的key,所以要注意,用lcase()或者js写.LIKETHIS。

PS:试试这个在jQuery中动态创建html:

var someLiElement = $('<li />').addClass('custom_class')
                 .text('Foo bar')
                 .attr('id', 'custom_id' + someInteger)

然后将方法附加到父元素

于 2010-04-01T12:57:34.593 回答