如何使用从 ajax coldfusion cfc 调用返回的 JSON
How to use JSON returned from ajax coldfusion cfc call
使用 CF 10。为了在不刷新整个页面的情况下重新填充选择,我正在对选择的更改进行远程 cfc 调用,该调用运行查询并以 JSON 格式返回。在我的 $.post(( 回调中,我获取此 JSON 文本并立即使用 JSON.parse(( 将其转换为 JS 对象。所以我现在有一个包含 2 个数组的 JS 对象:COLUMNS,它是所有列名的数组,DATA 是一个数组数组,每个数组代表查询中的一行。因此,查询中的每个字段都是 DATA[行号][列号]。
我试图弄清楚的是处理这个JS对象的最优雅的方法。 我可以轻松地使用 $.each(( 迭代它并填充选择的选项,但是如果我想在一列或多列上对结果集进行排序怎么办?或者按列名引用字段?我想知道在返回 qry 之前,我是否最好在 cfc 中做一些事情,例如将其转换为结构。以下是我的 cfc 函数代码:
<cffunction name="getStaffRemote" access="remote" returntype="query" returnformat="JSON" output="false">
<cfargument name="iEmpId" type="any" required="false" />
<cfset var qry= "" />
<cfquery name="qry" datasource="#this.DSN#">
SELECT iEmpid, vEmpLname, vEmpFname, isActive
FROM tEmployees
where 1=1
<cfif isDefined("arguments.iEmpId") AND isNumeric(arguments.iEmpId) AND arguments.iEmpId GT 0>
AND iEmpId = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.iEmpId#" />
</cfif>
</cfquery>
<cfreturn qry />
</cffunction>
感谢您的想法。顺便说一句,我也想知道为什么查询接受这一点。DSN,它只是 application.dsn 的副本。我认为当函数被远程直接调用时,应用程序范围变量对函数不可用,即"$.post('myCFC.cfc?method=getStaffRemote&...'">
(回复答复(:
非常好 - 谢谢!对于较大的查询,我会记住这一点。在这种情况下,我最终像jQuery一样使用返回的JSON-很简单,因为只有几列:
$.get("cfc/employees.cfc?method=getStaffRemote&vActive=" + vActive,
function(jsonText){
var qryStaff = JSON.parse(jsonText);
//qryStaff is now an object with 2 arrays: COLUMNS and DATA.
//COLUMNS is an array of strings of the column names.
//DATA is an array of arrays, where each array is a row.
//Thus, every data cell is DATA[rownumber][columnnumber]
//[0] = iEmpId
//[1] = vEmpLName
//[2] = vEmpFName
//[3] = isActive
$('#iEmpID_Staff').empty();
$.each(qryStaff.DATA, function() {
$('#iEmpID_Staff').append('<option value=' + $(this)[0] + '>' + $(this)[1] + ', ' + $(this)[2] + '</option>');
});
}
);
ColdFusion 在序列化查询对象时生成的 JSON 并不是最好的使用方法。我经常做的是将查询转换为结构数组并返回它。您最终会得到更大的 JSON 有效负载,因为列名称将重复,但是如果您启用了 gzip,这将有所帮助,但您需要考虑您有多少数据以及在这种情况下这是否是一个很好的解决方案,但值得考虑,以便您的前端开发人员以合理的格式获取 JSON :)
像这样的事情应该这样做:
<cffunction name="getStaffRemote" access="remote" returntype="query" returnformat="JSON" output="false">
<cfargument name="iEmpId" type="any" required="false" />
<cfset var qry= "" />
<cfquery name="qry" datasource="#this.DSN#">
SELECT iEmpid, vEmpLname, vEmpFname, isActive
FROM tEmployees
where 1=1
<cfif StructKeyExists(arguments, "iEmpId") AND isNumeric(arguments.iEmpId) AND arguments.iEmpId GT 0>
AND iEmpId = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.iEmpId#" />
</cfif>
</cfquery>
<cfscript>
var result = [];
for (var row in qry) {
arrayAppend(result, row);
}
return result;
</cfscript>
</cffunction>
这将返回如下所示的 JSON:
[
{"IEMPID":1, "VEMPLNAME":"Bloggs", "VEMPFNAME":"Jo", "ISACTIVE": true},
{"IEMPID":2, "VEMPLNAME":"Smith", "VEMPFNAME":"Sam", "ISACTIVE": true}
]
现在,在JS中进行排序变得更加简单,因为您可以执行以下操作:
myArray.sort(function(a, b) {
return something; // do your compare here
});
或者,您可以将要排序的列作为第二个参数传递给getStaffRemote
方法并添加 or 子句。如果你走这条路,你还需要保护它免受SQL注入攻击。
- 如何从ajax调用返回.wrap()元素
- Ajax调用返回当前html页面,而不是请求的文件
- 如何在模式框中显示ajax调用返回的数据
- AngularJS$http.post调用返回502(坏网关)错误
- 有没有更好的方法可以测量从Ajax调用返回数据所需的总时间
- 格式化AJax调用返回的Json,并将其分配给javascript变量
- calling.trigger(“click”),它在ajax调用返回的javascript代码中
- 在异步调用返回之前隐藏页面
- 对php文件的Ajax调用返回该文件中的JS代码,而不是执行它
- 如何在下一次 AJAX 调用中访问从一个 AJAX 调用返回的变量
- jQuery 延迟的 AJAX 调用返回值
- Django Ajax 调用返回 403 错误请求
- 从异步调用返回数组,然后为数组的每个元素返回其他异步调用
- 从函数返回函数而不调用返回的函数
- 当Json Length过长时,对ASP.NET MVC Controller的Ajax调用返回404
- 如何从jQuery中Ajax调用返回的数据中获取对象
- 如果statusCode不是200,那么从http调用返回什么类型的错误对象
- 如何使用jsonp调用返回的数据在Durandal中呈现视图
- 为什么我的ajax调用返回null
- 如何获取ajax调用返回的元素数