ric*_*ckp 5 coldfusion coldfusion-8 cfml
应用程序: JavaScript函数侦听表单元素的更改(输入和选择),并将数据发布到将它们分配给Session结构的CFC方法.返回结构,使表单数据可用于会话的生命周期.该应用程序根据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;
}
}
Run Code Online (Sandbox Code Playgroud)
标签语法:
<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>
Run Code Online (Sandbox Code Playgroud)
首先,你真的不需要翻译所有这些.CF8不支持cfscript中的组件/功能,但您可以按原样使用它:
<cfcomponent>
<cffunction name="preserveSession" access="remote" returntype="void" output="no">
<cfargument name="awardData" type="string" />
<cfscript>
var s = {};
var name = '';
var i = 0;
if(!isJSON(arguments.awardData)) return false;
arguments.awardData = deserializeJSON(arguments.awardData);
for(i=1; i<=arrayLen(arguments.awardData); i++) {
name = arguments.awardData[i].name;
if(!structKeyExists(s, name)) {
s[name] = arguments.awardData[i].value;
} else {
if(!isArray(s[name])) {
s[name] = [s[name]];
}
arrayAppend(s[name], arguments.awardData[i].value);
}
}
session.awardFormData = s;
return true;
</cfscript>
</cffunction>
</cfcomponent>
Run Code Online (Sandbox Code Playgroud)
尝试简单地重写这样的内容,而不是重写,看看你是否走得更远.
一般来说解释符号:s[name]地址s按键的结构存储的值name; 这有时称为数组表示法.它相当于s.theValueStoredInName知道名称的点符号.要动态地通过变量名称来解决结构,最简单的方法是通过数组表示法来实现.
嵌套集的相同之处:该行s[name] = [s[name]]正在设置一个键,name其值存储在指定键的存储值中s[name].通过包装该集合[],它就是一种类型的数组.
这有助于明确具体说明:
如果尚未将具有该name-key的内容指定为结构,则将其存储为结构(简单名称 - 键值).如果有,则将name-key值中的内容转换为具有该name-key的数组.然后,如果它是第二个项目的连续传递(它将是,if!只是检查此数组转换是否已经至少发生过一次),那么第二个项目将附加到具有关键字的数组一样的名字.
就个人而言,我只是为了简单而直接设置为数组.然后,您始终知道如何处理存储中的值.
| 归档时间: |
|
| 查看次数: |
790 次 |
| 最近记录: |