繁体   English   中英

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

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

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

现在,我正在使用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在application.cfc内部称为

 <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>

我不确定为什么有时会以errorLog结尾,但有时并不确定,但是在刷新页面或在应用程序内部手动输入页面URL时偶尔会发生这种情况(从ABC页面转到DEF页面)。

我正在使用Jquery Mobile,因此当Session初始化和第一页加载时,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语句。 之后定义了errMsgs,但问题仍然存在...令人沮丧。

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

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

警报会对其进行警报,但是,如果我稍后尝试抓住它,如下所示:

 err = jQuery.parseJSON(errorLog);

我得到NULL。 我的JSON看起来像这样( 有效,警告Session.errMsgs

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

或以下内容(无效,使用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.errorMsg”。

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

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

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

我想我找到了问题。 我正在使用RequireJS,并在片段上方调用了initiliaze requireJS的调用,该片段将变量输入了页面。 虽然这似乎在第一页上有效,但在下一页上,requireJS在重新解析js文件时似乎要快得多,因此在页面上设置变量之前已解析了寻找errorLog的文件。 在设置errorLog之后将requireJS init移至似乎可以解决此问题。...一些搜索...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM