使用键评估的ColdFusion循环结构失败!我错过了什么?

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

我做错了什么或有更好的方法来完成我想要做的事情(在表中显示数据库内容并通过同一个表更新(更新和删除)数据库内容)

Ada*_*tle 7

您发布的错误消息表明您滥用了评估功能.根据文档,它的工作原理如下:

从左到右动态评估一个或多个字符串表达式.(左侧的评估结果可能在右侧的表达式中有意义.)返回评估最右侧表达式的结果.

但是你也遇到了其他问题.对于初学者,当您将代码移动到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)

我想这可能会解决它.所以,总结一下:

  1. 更换你的发言<cfif key eq arguments.structString><cfif left(key,4) eq arguments.structString>(并确保你传递的"structString"的值包括下划线!)

  2. 替换您的使用evaluate:y = variables.instance.form[key]

我希望能解决你的问题......

让它工作后,开始考虑你的变量名称."Array"是一个可怕的变量名,因为它实际上是CFML中的保留字.并且使用"x"和"y"根本不是描述性的.这些类型的问题使得这个问题难以回答.