[英]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.