我很难过。我有一个现有的自动完成功能,当从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中,我在这里盲目。
我认为这些问题足够相关,不能将它们分成两个问题;如果你认为我应该告诉我。一如既往,谢谢。
答案 0 :(得分:9)
将查询结果放入结构中并将其添加到数组中。然后转换为json。自动完成功能期待json返回,并且label
或value
字段或两者都有。这是一个例子:
<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 ...
<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>