应用程序: 一个JavaScript函数监听表单元素(输入框和选择框)的变化,并将数据提交给CFC方法,该方法将它们分配给Session结构。该结构返回,使表单数据在会话的整个生命周期内可用。该应用程序是从Raymond Camden的使用服务器或会话存储持久保存表单值代码进行调整的。
问题:原始的CFC代码是用CFScript编写的。因为我们使用的是ColdFusion 8,在调用该方法时出现错误。因此,我将该方法转换为ColdFusion标记语法并停止了收到该错误。在Chrome的开发工具中,我可以看到每次输入表单元素时数据通过JSON对象传递到CFC。所以我知道JavaScript函数正在工作。尽管我没有收到任何返回错误,但有一些行为让我相信我的翻译是不正确的。例如,会话结构的转储仅显示最后一个输入元素,而不是所有输入元素(这是Ray演示中的情况)。
以下是原始的CFScript版本和我的标记翻译。除了对我的翻译错误的任何评论外,我想了解这行<cfset s.name = [s[name]] />
,特别是[s[name]]
的构造,因为我无法表达其中发生的事情。谢谢。
脚本语法:
component {
remote void function preserveSession(string awardData) {
if(!isJSON(arguments.awardData)) return;
arguments.awardData = deserializeJSON(arguments.awardData);
//convert the array into a name based struct
var s = {};
for(var i=1; i<=arrayLen(arguments.awardData); i++) {
var name = arguments.awardData[i].name;
if(!structKeyExists(s, name)) {
s[name] = arguments.awardData[i].value;
} else {
//convert into an array
if(!isArray(s[name])) {
s[name] = [s[name]];
}
arrayAppend(s[name], arguments.awardData[i].value);
}
}
session.awardFormData = s;
}
}
标签语法:
<cfcomponent>
<cffunction name="preserveSession" access="remote" returntype="void" output="no">
<cfargument name="awardData" type="string" />
<cfset var s = {} />
<cfif NOT isJSON(arguments.awardData)>
<cfreturn />
</cfif>
<cfset arguments.awardData = #deserializeJSON(arguments.awardData)# />
<cfloop index="i" from="1" to="#arrayLen(arguments.awardData)#">
<cfset name = #arguments.awardData[i].name# />
<cfif NOT structKeyExists(s, name)>
<cfset s.name = #arguments.awardData[i].value# />
<cfelse>
<cfif NOT isArray(s.name) >
<cfset s.name = [s[name]] />
</cfif>
<cfset arrayAppend(s.name, arguments.awardData[i].value) />
</cfif>
</cfloop>
<cfset session.awardFormData = s />
<cfreturn />
</cffunction>
</cfcomponent>