如何在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在应用程序内部调用。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移到似乎可以解决问题。。。。一些搜索。。。
- 在ColdFusion应用程序中使用JSON
- 当在coldfusion中通过AJAX传递时,FORM提交在IE浏览器中给出空表单
- ColdFusion XML to Javascript variable
- ColdFusion.Window.create不刷新弹出窗口
- Javascript-Coldfusion-选择后自动填充
- PHP 相当于 Coldfusion 的 cfpdfform
- Coldfusion将表单异步发布到cfc
- Coldfusion中的表单验证
- 使用ajax在coldfusion中引用表单值
- ColdFusion中的AJAX请求
- 如何处理'00'JSON中的结果是JS或Coldfusion
- 如何将文件类型从Coldfusion代码转换为javascript代码
- jQuery not posting - (jQuery - ColdFusion)
- 当用户检索表单时返回选中的复选框(Coldfusion)
- 如何在Jquery Mobile中刷新页面时使用Coldfusion toScript
- 如何使用通过javascript或viceversa创建的coldfusion删除cookie
- selectlist值的ColdFusion URL变量
- JS警报在ColdFusion中不起作用
- ColdFusion文件中的PHP变量值
- 在ColdFusion中表单范围中未定义AJAX请求的发布参数