mrt*_*181 2 coldfusion evaluation loops data-structures
我在我的cfm中有这个代码,它有效
<cfif not StructIsEmpty(form)>
<cfset larray = user.getArray() />
<cfloop collection="#form#" item="key">
<cfif left(key,4) eq "UPD_">
<cfset x = listLast(key,"_") />
<cfset y = evaluate(0,key) />
<cfloop index="j" from="1" to="#arrayLen(larray)#">
<cfif (larray[j][1] eq x) and (larray[j][3] neq y)>
<cfset larray[j][3] = y />
<cfif not LSIsNumeric(larray[j][3])>
<cfset larray[j][3] = "0" />
</cfif>
<cfset larray[j][4] = "update" />
</cfif>
</cfloop>
</cfif>
</cfloop>
<cfloop collection="#form#" item="key">
<cfif left(key,4) eq "DEL_">
<cfset x = listLast(key,"_") />
<cfloop index="k" from="1" to="#arrayLen(larray)#">
<cfif larray[k][1] eq x>
<cfset larray[k][4] = "delete" />
</cfif>
</cfloop>
</cfif>
</cfloop>
<cfset user = createObject("component", "cfc.User").init(
identifier = FormatBaseN(form.id,10),
array = larray
) />
</cfif>
<form name="usform" method="POST">
<cfset array = user.getArray() />
<cfoutput>
<cfloop index="i" from="1" to="#arrayLen(array)#">
<table>
<tr>
<td><input type="text" name="upd_#array[i][1]#" maxlength="6" size="6" value="#array[i][3]#" /></td>
<td><input type="checkbox" name="del_#array[i][1]#" /></td>
</tr>
</table>
<input type="hidden" name="id" value="#user.getIdentifier()#" />
</cfoutput>
</form>
Run Code Online (Sandbox Code Playgroud)
我已将它放入cfc以分离我的逻辑和我的观点,我试图使它更通用
<cfcomponent name="ArrayManager" output="false">
<cffunction name="init" hint="constructor" output="false" returntype="ArrayManager">
<cfargument name="user" type="User" required="true" hint="User bean" />
<cfargument name="form" type="Struct" required="true" />
<cfset variables.instance.array = arguments.user.getArray() />
<cfset variables.instance.form = arguments.form />
<cfreturn this />
</cffunction>
<cffunction name="update" access="public" output="true" returntype="boolean">
<cfargument name="structstring" type="String" required="true" />
<cfargument name="seperator" type="String" required="true" />
<cfset var x = "0" />
<cfset var y = "0" />
<cfloop collection="#variables.instance.form#" item="key">
<cfif key eq "#arguments.structstring#">
<cfset x = listLast(key,"#arguments.seperator#") />
<cfset y = evaluate(0,key) />
<cfloop index="j" from="1" to="#arrayLen(variables.instance.array)#">
<cfif (variables.instance.array[j][1] eq x) and (variables.instance.array[j][3] neq y)>
<cfset variables.instance.array[j][3] = y />
<cfif not LSIsNumeric(variables.instance.array[j][3])>
<cfset variables.instance.array[j][3] = "0" />
</cfif>
<cfset variables.instance.array[j][4] = "update" />
</cfif>
</cfloop>
</cfif>
</cfloop>
<cfset arguments.user.init(array = variables.instance.array) />
<cfreturn true />
</cffunction>
<cffunction name="delete" access="public" output="false" returntype="boolean">
<cfargument name="structstring" type="String" required="true" />
<cfargument name="seperator" type="String" required="true" />
<cfset var x = "0" />
<cfloop collection="#variables.instance.form#" item="key">
<cfif key eq "#arguments.structstring#">
<cfset x = listLast(key,"#arguments.seperator#") />
<cfloop index="k" from="1" to="#arrayLen(variables.instance.array)#">
<cfif variables.instance.array[k][1] eq x>
<cfset variables.instance.array[k][4] = "delete" />
</cfif>
</cfloop>
</cfif>
</cfloop>
<cfset arguments.user.init(array = variables.instance.array) />
<cfreturn true />
</cffunction>
</cfcomponent>
Run Code Online (Sandbox Code Playgroud)
而我的新cfm
<cfif not StructIsEmpty(form)>
<cfset arraymanager = createObject("component","cfc.ArrayManager").init(user,form) />
<cfset seperator = "_" />
<cfset structstring = "UPD" />
<cfset arraymanager.update(structstring,seperator) />
</cfif>
...
Run Code Online (Sandbox Code Playgroud)
它失败了,我收到此错误消息
CFML编译器遇到意外的coldfusion.compiler.CompilerInternalException异常.原因是:无法完成CFML到Java的翻译.发生在:
...
错误发生在C:\ path\to\document\root\cfc\ArrayManager.cfc:第21行
从C:\ path \调用到\ document\root\cfc\update-emp.cfm:第66行
从C调用:\C:\ path\to\document\root\cfc\update-emp.cfm:第66行19 : 21 : 23`:
: <cfif key eq "#arguments.structstring#">
20: <cfset y = evaluate(0,key) />
22
我做错了什么或有更好的方法来完成我想要做的事情(在表中显示数据库内容并通过同一个表更新(更新和删除)数据库内容)
您发布的错误消息表明您滥用了评估功能.根据文档,它的工作原理如下:
从左到右动态评估一个或多个字符串表达式.(左侧的评估结果可能在右侧的表达式中有意义.)返回评估最右侧表达式的结果.
但是你也遇到了其他问题.对于初学者,当您将代码移动到CFC时,您没有正确复制逻辑.
在您的工作代码中,您使用条件:
<cfif left(key,4) eq "UPD_">
Run Code Online (Sandbox Code Playgroud)
但是在你的CFC中你有:
<cfif key eq arguments.structString>
Run Code Online (Sandbox Code Playgroud)
这应该是:
<cfif left(key,4) eq arguments.structString>
Run Code Online (Sandbox Code Playgroud)
接下来,您没有使用最佳语法进行评估,您可能根本不想使用它.该声明:
y = evaluate(0,key)
Run Code Online (Sandbox Code Playgroud)
可以改写为:
y = evaluate(key)
Run Code Online (Sandbox Code Playgroud)
由于key的值是"UPD_something",因此可以将其重写为:
y = [variables|arguments|etc].UPD_Something
Run Code Online (Sandbox Code Playgroud)
(由于您没有明确指定变量作用域,因此CF将尝试按特定顺序在一组作用域中查找变量;这就是我使用语法[a | b | ...]的原因)
你可能不是这个意思,你可能想要表格中的值.由于密钥名称是动态的,因此您应该以这种方式访问它(而不是使用evaluate):
y = variables.instance.form[key]
Run Code Online (Sandbox Code Playgroud)
我想这可能会解决它.所以,总结一下:
更换你的发言<cfif key eq arguments.structString>与<cfif left(key,4) eq arguments.structString>(并确保你传递的"structString"的值包括下划线!)
替换您的使用evaluate:y = variables.instance.form[key]
我希望能解决你的问题......
让它工作后,开始考虑你的变量名称."Array"是一个可怕的变量名,因为它实际上是CFML中的保留字.并且使用"x"和"y"根本不是描述性的.这些类型的问题使得这个问题难以回答.