cfparam'd变量怎么可能未定义?

时间:2011-10-12 13:09:51

标签: coldfusion

许多来源通常通过<cfthread ..>调用单个资源,但有些使用<cfinclude ..>

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

我收到了这个错误:

  

变量PREVIOUS_STATE未定义。

行记录指向此代码块中的<cfif ..>

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

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

</cfif>

我的问题是如何定义previous_state?

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

我在一个简单的代码段中复制它时遇到了麻烦。我已尝试将变量设置为使用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正在尝试使用此代码执行时不再存在的范围。

3 个答案:

答案 0 :(得分:2)

由于代码在CFTHREAD标记内,我应该将previous_state作为CFTHREAD属性传递,例如:

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

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

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

    </CFTHREAD>

引用CF文档:

“属性范围包含传递给范围的属性,并且仅在线程中可用,并且仅在线程的生命周期中可用。”

答案 1 :(得分:1)

要使previous_state未定义,则需要为null。您需要执行类似

的操作
<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>

答案 2 :(得分:0)

确保正确调整变量的范围,上面的示例中有一个拼写错误。我在ACF9.0.1和Railo 3.3.1.000

上运行此代码时遇到问题
<cfparam    name=       "previous_state"
            default=    "" />

<cfdump var="#previous_state#">