2

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

现在我正在使用一个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,因此当会话初始化和第一页加载时,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)
4

2 回答 2

1

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

<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,但这更像是一种风格。

于 2012-07-25T18:40:26.053 回答
0

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

于 2012-07-25T20:43:26.980 回答