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