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

从coldfusion查询生成json以用于jquery自动完成,jquery,json,coldfusion,jquery-autocomplete,Jquery,Json,Coldfusion,Jquery Autocomplete,我被难住了。我有一个现有的autocomplete函数,当从ColdFusion autosuggest输入调用时,该函数可以工作。现在,我试图将页面转换为使用jQuery自动完成输入,但无法使其工作。以下是autosuggest.cfc中的现有函数: <cffunction name="lookupSerialNumber" access="remote" returntype="Array" > <cfargument name="search" type="any

我被难住了。我有一个现有的autocomplete函数,当从ColdFusion autosuggest输入调用时,该函数可以工作。现在,我试图将页面转换为使用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>
请注意,前六个响应包含在双引号内,而其余响应不包含在双引号内。自动完成显示前六个响应,但不显示其余响应

这是我的第一个问题。第二,我希望将响应注入文本和输入值中;目前,只有文本显示响应。我并不惊讶,因为我只返回一个值。然而,我不知道如何实现这一点

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

$(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中,所以我在这里瞎了眼


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

将查询结果放入结构中,并将其添加到数组中。然后转换为json。autocomplete需要返回json和一个标签或一个值字段,或者两者兼而有之。以下是一个例子:

<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>
如果serializeJSON函数在您使用的CF的任何版本中都可用,则可以使用它。如果没有,则手动构建json字符串


这里有一个提示:

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

另一个答案返回类似的结果

[{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) />

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

CFRemoting以面向对象的方式在这里使用Mura CMS

snProxy.cfc JQuery绑定。。。
我会把剩下的留给更有资格的人;但引用可能是由于隐式转换。前六个值显然不是数字,因为它们以前导0开头。剩下的部分可能被视为数字,而autocomplete和OP的ajax都在期待json的回归。它不明白。autcomplete还需要一个标签或值字段或两者来填充输入。@jk-有意义。我想它应该是json格式的。但除此之外没有什么可以提供的;谢谢jk。我也为你的网站添加了书签。当然希望自动完成API更完整。对于那些无法访问该网站的人,这里是博客的存档:你知道什么。。。别理它。我想我投票删除我自己的答案。。。我的回答更简单。可能对某些人有帮助,但并不能真正回答老年退休金计划的问题。
<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); 
    })
  }
})
<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>    
<script type="text/javascript">
    $(function() {
        $("input##serial_numbers").autocomplete({
        source: "/com/snProxy.cfc?method=get&returnFormat=json",
        minLength: 1
        });
    });
</script>