从coldfusion查询中形成json以用于jquery自动完成

时间:2011-10-18 22:33:03

标签: jquery json coldfusion jquery-autocomplete

我很难过。我有一个现有的自动完成功能,当从ColdFusion自动提示输入调用时,它可以工作。现在,我正在尝试将页面转换为使用jQuery自动完成输入,并且无法使其工作。这是现有的函数,在autosuggest.cfc中:

<cffunction name="lookupSerialNumber" access="remote" returntype="Array" >
    <cfargument name="search" type="any" required="false" default="">

    <!--- Define variables --->
    <cfset var data="">
    <cfset var result=ArrayNew(1)>

    <!--- Do search --->
    <cfquery name="data">
        SELECT DISTINCT SERIAL_NUMBER
        FROM myTable
        WHERE SERIAL_NUMBER LIKE '%#trim(ARGUMENTS.search)#%'
        ORDER BY SERIAL_NUMBER
    </cfquery>

    <!--- Build result array --->
    <cfloop query="data">
        <cfset ArrayAppend(result, list)>
    </cfloop>

    <!--- And return it --->
    <cfreturn result />
</cffunction>

当我在输入“01”后从自动完成输入中调用它时,控制台会显示如下响应:

   ["0000003001","0100002000","0100002001","0100002002","0100002003","0100002004",7300000100,7300000101,7300000102,7300000103,7300000104,7300000105,7300000107,7300000108,7300000109,7300000110,7300000111,7300000112]

请注意,前六个回复都在双引号内,而其余的则不是。自动完成功能显示前六个响应,但不显示其余响应。

这是我的第一个问题。第二个是我希望将响应注入到输入的文本和值中;目前,只有文字显示回复。我并不感到惊讶,因为我只返回一个值。但是,我无法弄清楚如何实现这一目标。

我尝试使用解析函数初始化自动完成功能,如下所示:

$(document).ready(function(){
        $('#myInputID').autocomplete(
            {source: function(request, response) {
                $.ajax({
                    url: "cfc/autoSuggest.cfc?method=lookupSerialNumber>&returnformat=json",
                    dataType: "json",
                    data: {
                      search: request.term,
                      maxRows: 10
                    },
                    success: function(data) {
                      response(data);
                    }                   
                })
            },
            parse: function(data){
                return $.map(data, function(item) {
                    return { data: item, value: item, result: item };
                });
            }
        });
    });

但这没有任何结果。由于解析函数不在自动完成API中,我在这里盲目。

我认为这些问题足够相关,不能将它们分成两个问题;如果你认为我应该告诉我。一如既往,谢谢。

3 个答案:

答案 0 :(得分:9)

将查询结果放入结构中并将其添加到数组中。然后转换为json。自动完成功能期待json返回,并且labelvalue字段或两者都有。这是一个例子:

<cffunction name="lookupSerialNumber" access="remote" returntype="String" >
    <cfargument name="search" type="any" default="">

    <!--- Define variables --->
    <cfset var data="">
    <cfset var result=ArrayNew(1)>
    <cfset var returnStruct = "">


    <!--- Do search --->
    <cfquery name="data">
        SELECT DISTINCT SERIAL_NUMBER
        FROM myTable
        WHERE SERIAL_NUMBER LIKE <cfqueryparam value="%#trim(ARGUMENTS.search)#%" 
                                     cfsqltype="cf_sql_varchar">

        ORDER BY SERIAL_NUMBER
    </cfquery>

    <!--- Build result array --->
    <cfloop query="data">
        <cfset returnStruct = StructNew() />
        <cfset returnStruct["label"] = SERIAL_NUMBER />

        <cfset ArrayAppend(result,returnStruct) />
    </cfloop>

    <!--- And return it --->
    <cfreturn serializeJSON(result) />
 </cffunction>

如果您使用的是任何版本的CF,则可以使用serializeJSON功能。如果没有,请手动构建json字符串。

这是一个啧啧:http://www.jensbits.com/2010/03/18/jquery-ui-autocomplete-with-coldfusion/

答案 1 :(得分:0)

刚刚遇到这个寻找类似的解决方案,但我必须说,返回结构数组并不遵循JSON AJAX返回的大多数约定,即使在使用serializeJSON之后也是如此。

另一个答案会返回类似

的内容
[{key:value}, {key:value}, {key:value}...]

而通常情况下,您希望看到

{key:value,key:value,key:value...}

所以这是我需要使用后一种格式的代码的调整版本

<cffunction name="lookupSerialNumber" access="remote" returntype="String" >
<cfargument name="search" type="any" required="false" default="">

<!--- Define variables --->
<cfset var data="">
<cfset var result=StructNew()> <!--- Is now a Struct instead of Array --->

<!--- Do search --->
<cfquery name="data">
    SELECT DISTINCT SERIAL_NUMBER
    FROM myTable
    WHERE SERIAL_NUMBER LIKE '%#trim(ARGUMENTS.search)#%'
    ORDER BY SERIAL_NUMBER
</cfquery>

<!--- Build result array --->
<cfloop query="data">
  <cfset returnStruct = StructNew() />
  <cfset returnStruct["label"] = SERIAL_NUMBER />

  <cfset StructAppend(result,returnStruct) /> 
  <!--- Append the temporary struct to the main struct --->
</cfloop>

<!--- And return it --->
<cfreturn serializeJSON(result) />

这样做的好处是更容易解析:

$.ajax({
  url: 'path/to.cfc',
  dataType: 'json',
  data: {
    search: searchWord
  }
  success: function(data) {
    //Easy Parsing Bit here...
    $.each(data, function(key, val) {
      alert(key + ': ' + val); 
    })
  }
})

而在此之前,您必须输入数组,然后解析各个JSON条目...

答案 2 :(得分:0)

使用Mura CMS在OO Fashion中进行CFRemoting ...

snProxy.cfc

<cfcomponent extends="mura.cfobject">

    <cfset variables.searchterm = ''>

    <cffunction name="get" access="remote" output="true">
    <cfargument name="searchterm" required="true">

        <cfset var $=getBean("MuraScope").init(session.siteid)>    
        <cfset variables.searchterm = arguments.searchterm >    

        <cfquery name="get" datasource="#request.dsn#">
                SELECT DISTINCT SERIAL_NUMBER    
                FROM tbl_serial_numbers 
                WHERE SERIAL_NUMBER like <cfqueryparam value="%#variables.searchterm#%" cfsqltype="cf_sql_varchar" />
        </cfquery>

        <cfset response = listToArray(valueList(get.SERIAL_NUMBER))>
        <cfset data = #createobject("component","mura.json").encode(response)#>

        <cfreturn data />

    </cffunction>    

</cfcomponent>    

JQuery Bind ......

<script type="text/javascript">
    $(function() {
        $("input##serial_numbers").autocomplete({
        source: "/com/snProxy.cfc?method=get&returnFormat=json",
        minLength: 1
        });
    });
</script>