许多来源通常通过<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
正在尝试使用此代码执行时不再存在的范围。
答案 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#">