gpt4 book ai didi

javascript - 如何使用 ajax Coldfusion cfc 调用返回的 JSON

转载 作者:行者123 更新时间:2023-11-27 23:21:54 26 4
gpt4 key购买 nike

使用 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>

谢谢你的想法。顺便说一句,我也想知道为什么查询接受 this.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 注入(inject)攻击。

关于javascript - 如何使用 ajax Coldfusion cfc 调用返回的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com