簡體   English   中英

在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在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM