2011-10-12 64 views
3

很多来源调用单个资源,通常通过<cfthread ..>,但有些使用<cfinclude ..>cfparam'd变量如何定义?

理想情况下,代码查找变量previous_state。如果通过了一些变体,那么资源将尝试使用它们。

我收到此错误:

Variable PREVIOUS_STATE is undefined.

线记录指向<cfif ..>在此块的代码。

<cfparam name=  "previous_state" 
      default= "" /> 

<cfif isSimpleValue(previous_state) 
     and len(previous_state) eq 0> 
    <cfset previous_state= previousState /> 

</cfif> 

我的问题是previous_state怎么能被undefined?

我可以在应用程序中复制它,但它是一个相当复杂的使用线程的代码链。也许这个参考被垃圾收集器吃掉了?

我无法在简单的代码段中复制它。我试过设置变量返回一个函数returnType= "void",但<cfparam ..>似乎将其重置为空字符串。

下面是完整的代码上下文。我删除了无关的变量等。

// Page 
oComponent.foo(); 

// Component.foo() 
<cfset var local= { 
    previous_state= QueryNew("foo" , "varchar") 

} /> 

<cfthread name= "foo_#createUUID()#" 
      previousState= "#local.previous_state#"> 
    <!--- Module does unrelated things... ---> 
    <cfmodule template= "some_module.cfm"> 
     <cfoutput> 
     // unrelated things 

     <cfparam name=  "previous_state" 
        default= "" /> 

     <!--- Next line is throwing error. ---> 
     <cfif isSimpleValue(previous_state) 
       and len(previous_state) eq 0> 
      <cfset previous_state= previousState /> 

     </cfif> 

     </cfoutput> 

    </cfmodule> 

</cfthread> 

我现在想cfparam试图使用不再受这个代码执行时就存在一个范围。

+0

上面的代码是否定义在CTHREAD标签中? –

+0

是的。它看起来像线程内的一个范围问题。 –

+0

绝对是一个范围界定问题。我并没有乱用cfthread,但我相信previous_state应该在属性范围(attribute.previous_state)中。 – webRat

回答

2

由于代码是你应该通过previous_state作为CFTHREAD属性,如CFTHREAD标签我的事内:

<cfparam name="previous_state" default="" /> 

    <CFTHREAD previous_state = previous_state 
    previousState= "#local.previous_state#"> 

    <cfif isSimpleValue(ATTRIBUTES.previous_state ) ........ 

    </CFTHREAD> 

引述CF文档:

“的Attribut es作用域包含传递给作用域的属性,并且只能在线程中使用,并且只能用于线程的生命周期。“

0

确保正确地确定变量的范围,并且上面的示例中有一个错字。我并没有在两个ACF9.0.1运行此代码和问题Railo 3.3.1.000

<cfparam name=  "previous_state" 
      default= "" /> 

<cfdump var="#previous_state#"> 
+0

错字在哪里? –

+0

开始认为这是一个线程范围问题。追溯完整的执行路径... –

1

对于previous_state是未定义它需要为空。你需要做一些像

<cfif isNull(previous_state)>true</cfif> 

为了证明这一点尝试以下

<cfset previous_state = "" /> 
<!--- Change to set previous_state ---> 
<cfset previous_state = javacast("null", previous_state) /> 

<cfparam name="previous_state" default="" /> 

<cfif isSimpleValue(previous_state) and len(previous_state) eq 0 > 
    <cfset previous_state = previousState /> 
</cfif> 
+0

我在CF8上使用该示例成功执行。 –