我有一个多语言站点,需要将不同语言的错误消息传递给浏览器以进行客户端表单验证。
现在我正在使用一个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)