Как переменная cfparam'd может быть неопределенной? - PullRequest
3 голосов
/ 12 октября 2011

Многие источники вызывают один ресурс, обычно через <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 ]

2 голосов
/ 12 октября 2011

Поскольку код находится в теге 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 голос
/ 12 октября 2011

Чтобы предыдущее состояние было неопределенным, оно должно быть нулевым. Вам нужно будет сделать что-то вроде

<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 голосов
/ 12 октября 2011

Убедитесь, что вы правильно указали переменные и в приведенном выше примере есть опечатка.У меня нет проблем с запуском этого кода на ACF9.0.1 и Railo 3.3.1.000

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

<cfdump var="#previous_state#">
...