如何在Jquery Mobile中刷新页面时使用Coldfusion toScript

How to use Coldfusion toScript when refreshing a page in Jquery Mobile?

本文关键字:toScript Coldfusion 刷新 Jquery Mobile      更新时间:2024-02-05

我有一个多语言网站,需要将不同语言的错误消息传递到浏览器以进行客户端表单验证。

现在我使用的是一个error.cfc,它包含:

 <cfcomponent displayname="errorMsg" hint="create error msgs">  
      <cffunction name="createErrMsgsLog" output="false" returntype="string">               
           <cfset var allErrMsgs=ArrayNew(2)>
           <cfquery datasource="db" name="texte" cachedWithin="#Session.globalCache#">
                ... query db for snippets and text blocks ...
           </cfquery>
           <cfoutput query="texte"><cfset "#trim(snippet)#" = "#trim(text)#"></cfoutput>
           <cfscript>
                allErrMsgs[1][1] = "comp";
                allErrMsgs[1][2] = tx_validate_comp;
                ...
           </cfscript>
           <cfset Session.errMsgs = serializeJSON(allErrMsgs)>
           <cfreturn Session.errMsgs> 
      </cffunction>
 </cfcomponent> 

因此,我获取所有文本,填充一个数组,该数组被序列化并作为字符串返回。

cfc在应用程序内部调用。fc

 <cffunction name="onSessionStart" returnType="boolean" output="false" hint="session initalizer">
      ...
      <cfinvoke component="services.errorMsg" method="createErrMsgsLog" returnvariable="errMsgs"></cfinvoke>
      <cfset Session.errMsgs = errMsgs>
      ...
 </cffunction>

在每一页上,我都会这样写:

 <script type="text/javascript" language="JavaScript">var #toScript(Session.errMsgs, "errorLog")#</script>

我不知道为什么我最终会出现错误日志有时是未定义的,但当我刷新页面或在应用程序中手动输入页面URL时(从页面ABC转到页面DEF),这种情况偶尔会发生。

我使用的是Jquery Mobile,所以当会话初始化和第一个页面加载时,errorLog会在第一个页面中呈现一次。由于所有后续页面都是从该页面拉入/删除的,因此初始errorLog始终处于活动状态。我想当手动更改URL时,我会丢失第一个页面的errorLog,因为我正在加载一个新页面,但我不明白为什么新页面没有得到"它自己的"errorLog,或者为什么它突然没有定义。

问题:
知道我如何确保定义了errorLog吗=我如何确保在Coldfusion中创建errorMessages?

谢谢你的帮助!

编辑:好的。我在Coldfusion中添加了一个检查,所以如果Session变量未定义,我会重新创建它。然而,到目前为止,它总是存在的。似乎只有当我手动更改URL并转到另一个页面时才会发生这种情况。我可以在IE8中复制。奇怪的是,当我检查IE8调试器时,errorLog就在那里,但我仍然收到一个错误,告诉我它是未定义的。。。

编辑:
我已经将cfinvoke移动到了application.cfc.中的请求处理程序

    <cfif len( Session.errMsgs ) EQ 0>
        <cfinvoke component="services.errorMsg" method="createErrMsgsLog" returnvariable="errMsgs"></cfinvoke>
        <cfset Session.errMsgs = errMsgs> 
    </cfif> 

Coldfusion部分似乎工作正常,因为只有当应用程序启动时,我才会进入if语句。之后定义了errMsg,但问题仍然存在。。。令人沮丧。

编辑
另一个原因可能是我的JSON字符串。我是这样设置的:

 <script type="text/javascript">var #toScript(Session.errMsgs, "errorLog")#; alert(errorLog);</script>

警报会提醒它,但如果我稍后试图抓住它,就像这样:

 err = jQuery.parseJSON(errorLog);

我变空了。我的JSON如下(有效,提醒会话.errMsgs

 [["firma","Bitte Firmennamen eingeben!"],["firma_re","Bitte Firmennamen eingeben!"],... 

或this(无效,使用toScript输出):

 "[['"firma'",'"Bitte Firmennamen eingeben!'"],['"firma_re'",'.... (invalid)

嗯,我不确定是否是这样,但我注意到了几个错误:

<cfif len( Session.errMsgs ) EQ 0>
    <cfinvoke component="services.errorMsg" method="createErrMsgsLog" returnvariable="errMsgs"></cfinvoke>
    <cfset Session.errMsgs = errMsgs> 
</cfif> 

应该是:

<cfif arrayLen( Session.errMsgs ) EQ 0>
    <cfinvoke component="services.error" method="createErrMsgsLog" returnvariable="errMsgs"></cfinvoke>
    <cfset Session.errMsgs = errMsgs> 
</cfif>

Session.errMsgs应该是一个数组,因此您可以使用arrayLen()函数。此外,您可以通过文件名而不是显示名来调用组件,因此使用"services.error"而不是"services.eerrorMsg"。

此外,我会直接在组件的返回中设置变量,以避免任何变量范围问题:

<cfinvoke component="services.error" method="createErrMsgsLog" returnvariable="SESSION.errMsgs"></cfinvoke>

实际上,我可能根本不会使用cfinvoke,但这更像是一种风格。

我想我发现了问题。我使用的是RequireJS,我调用了在代码段上方初始化RequireJS,代码段在页面上输入了变量。虽然这似乎在第一个页面上有效,但在随后的页面上,requireJS似乎在重新解析js文件方面要快得多,因此在页面上设置变量之前,就已经解析了查找errorLog的文件。在设置errorLog之后将requireJS init移到似乎可以解决问题。。。。一些搜索。。。