我已经简化了这段代码,以便于解释。
我有一个cfm页面,用户点击表格行并获取ID。我想将该ID发送到CFC,在那里运行查询,并将结果返回到cfm页面。
这是JQuery的样子。
$.ajax({
url: "test.cfc?method=testFunction",
data: {ID:123456},
success: function(response) {
$("#div1").html(response);
}
});
以及cfc的样子。
<cfcomponent>
<cffunction name="testFunction" access="remote" returnType="query" returnFormat="JSON">
<cfquery name="testQuery" datasource="x">
Select ID, NAME
From Table
Where ID = '#url.ID#'
</cfquery>
<cfreturn testQuery>
</cffunction>
</cfcomponent>
编辑 - 替代CFC方法
<cffunction name="testFunction" access="remote">
<cfquery name="testQuery" datasource="x">
Select ID, NAME
From Table
Where ID = '#url.ID#'
</cfquery>
<cfset response = [] />
<cfoutput query="testQuery">
<cfset obj = {
"ID" = ID,
"NAME" = NAME
} />
<cfset arrayAppend(response, obj) />
</cfoutput>
<cfprocessingdirective suppresswhitespace="Yes">
<cfoutput>
#serializeJSON(response)#
</cfoutput>
</cfprocessingdirective>
<cfsetting enablecfoutputonly="No" showdebugoutput="No">
</cffunction>
由于顶部的ajax调用中的成功函数显示,div1将填充JSON响应,如下所示。
{"COLUMNS":["ID","NAME"],"DATA":[[123456,"John"]]}
编辑 - 替代响应
[{"ID":123456,"NAME":"John"}]
接下来我希望能够在我页面的某个地方使用和输出该JSON响应中的数据。我怎样才能做到这一点?我很难理解解析这些数据。 我主要关注的是从数组格式中获取这些数据,以便将其输出到页面中的表单字段中。
答案 0 :(得分:1)
CF11:支持,请参阅doc中的serialization.serializeQueryAs
。
CF10或以下:返回queryToArray(testQuery)
,不要忘记更改testQuery
private function queryToArray(q) {
var s = [];
var cols = q.columnList;
var colsLen = listLen(cols);
for(var i=1; i<=q.recordCount; i++) {
var row = {};
for(var k=1; k<=colsLen; k++) {
row[lcase(listGetAt(cols, k))] = q[listGetAt(cols, k)][i];
}
arrayAppend(s, row);
}
return s;
}
或者,使用:https://github.com/cutterbl/serializeCFJSON使用Javascript解析客户端的CF查询数据集。
答案 1 :(得分:1)
我想出了最好的方法。
让cfc仅使用大括号返回查询结果,而不是带括号的数组。
<cfcomponent>
<cffunction name="testFunction" access="remote">
<cfquery name="testQuery" datasource="x">
Select ID, NAME
From Table
Where ID = '#url.ID#'
</cfquery>
<cfoutput query="testQuery">
<cfset obj = {
"ID" = ID,
"NAME" = NAME
} />
</cfoutput>
<cfprocessingdirective suppresswhitespace="Yes">
<cfoutput>
#serializeJSON(obj)#
</cfoutput>
</cfprocessingdirective>
<cfsetting enablecfoutputonly="No" showdebugoutput="No">
</cffunction>
JQuery看起来像这样
$.ajax ({
//location of the cfc
url: "test.cfc",
//function name and url variables to send
data: {method:'functioname', ID:ID},
//function run on success can the returned json object and split it out each field to a form field. Here I'm just showing one field in the alert.
success: function(obj) {
var parsedjson = $.parseJSON(obj);
alert(parsedjson.ID);
}
});
答案 2 :(得分:0)
(评论太长)
简化和巩固代码的一些改进
不需要cfoutput
或cfsetting
以及函数内部。只需返回原始结构&#34;按原样#34;。要自动将响应转换为JSON,只需将URL参数?returnformat=json
附加到您的ajax调用
将dataType: "json"
添加到您的ajax调用中,jQuery会自动将响应解析为JSON对象
不要忘记使用VAR
或LOCAL
通常,您希望避免直接从函数中访问URL
范围。而是将ID定义为参数。然后在查询中引用ARGUMENTS.ID
而不是URL.ID
<强>的jQuery 强>
$.ajax({
type: "GET",
url: "test.cfc",
// return the result as JSON
data: {method: "testFunction", ID:someID, returnFormat: "JSON"},
// automatically parse JSON response
dataType: "json",
success: function (response) {
// check RECORDCOUNT to determine if ID was found
alert("ID="+ response.ID);
},
error: function (request, status, error)
{
// do something if call fails..
alert(error);
}
});
<强> CFC:强>
<cfcomponent>
<cffunction name="testFunction" access="remote" returntype="struct">
<cfargument name="ID" type="string" required="true">
<cfquery name="LOCAL.testQuery" datasource="x">
Select ID, NAME
From Table
Where ID = <cfqueryparam value="#arguments.ID#" cfsqltype="cf_sql_varchar">
</cfquery>
<!--- note, this assumes the query only ever returns 0 or 1 record --->
<cfset Local.obj = { recordCount=testQuery.recordCount, ID=testQuery.ID, Name=testQuery.Name }>
<cfreturn Local.obj>
</cffunction>
</cfcomponent>