从coldfusion查询生成json以用于jquery自动完成
我被难住了。我有一个现有的autocomplete函数,当从ColdFusion autosuggest输入调用时,该函数可以工作。现在,我试图将页面转换为使用jQuery自动完成输入,但无法使其工作。以下是autosuggest.cfc中的现有函数:从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
<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>