2012-04-19 50 views
0

我有了被查詢後設置從一個onclick一個的loggedIn布爾的AdminBean:因爲我想做一個不同的JavaScript事情JSF F:阿賈克斯的OnEvent不讀書豆值

<h:commandButton rendered="#{!adminBean.loggedIn}" styleClass="moreButtonAsText" id="adminLoginAsText" value="Login" action="#{adminBean.logIn}"> 
     <f:ajax render="detailsBox adminForm" execute="@form" onevent="onevent"/> 
    </h:commandButton> 

    </h:form> 
</div> 

<script type="text/javascript"> 
    function onevent(e){ 
    if(e.status=='success') { 
     alert(#{adminBean.loggedIn}); 
    } 
    if(e.status=='complete') { 
     alert(#{adminBean.loggedIn}); 
    } 
    } 
</script> 

我需要這個基於用戶是否成功登錄。首先點擊命令按鈕(顯然),然後登錄設置爲true。我有這個明確我AdminBean類:

public boolean isLoggedIn() { 
    System.out.println(loggedIn); 
    return loggedIn; 
} 

本來我有一個OnEvent所有嵌套像onevent="#{adminBean.loggedIn} ? yesFunction : noFunction,但這並沒有工作。所以我四處看了看,發現 http://fyhao.com/2010/05/computer-and-it/java/java-server-faces/jsf-2-fajax-why-execute-onevent-three-times/ 所以我決定把它分解成一個內聯函數,但是這仍然不起作用。
然後,我決定去我上面發佈的東西,除了清楚的警報聲明,以什麼JavaScript認爲值是什麼(和我的印刷線,看看他們是否同意...)

Java控制檯,由第一次警報(它是e.status=='complete'),首先打印出很多錯誤,然後打印出很多trues。
JavaScript提醒爲false。

然後清除控制檯並在警報上單擊確定。控制檯然後打印什麼也沒有,並且第二個警報被調用,仍然是錯誤的。所以我的JavaScript失敗了。

現在我注意到另一個奇怪的事情...... AdminBean是會話作用域。當我再次按下地址欄中的輸入時,無論我做什麼,JavaScript都會提示真實...即使呈現仍然正常工作(即使JavaScript警報true未顯示登錄時也應呈現的內容) 。

這是怎麼回事?

如果您需要更多信息/代碼,請詢問。

編輯#1:

當我在上面,我試圖onevent="#{adminBean.loggedIn} ? yesFunction : noFunction, 我也試過onevent="#{adminBean.loggedIn} ? yesFunction : noFunction說。我意識到我可能會缺少這些函數的引號/撇號,但在解決該問題之前,我想修復adminBean.loggedIn問題。

編輯#2:

看到所選的答案;我正在研究這個解決方案,然後答案基本證實了我的結果。

<h:form id="javascriptHack"> 
    <h:form id="hiddenJS" rendered="#{adminBean.loggedIn}" > 
    <script type="text/javascript"> 
     $(function() { 
     (#{adminBean.loggedIn}) ? slowCloseAdminPanel() : adminPanelLeftOpen(); 
     }); 
    </script> 
    </h:form> 
</h:form> 

這可能是一個駭人的做法,但它的工作原理。

回答

1

這是因爲您的ajax請求不會更新腳本。它仍然會保持初始值。你可以把腳本放在<h:form>之內。這應該工作。

+0

最初我有'onevent =「#{adminBean.loggedIn}?first:second」,它位於f:ajax中,它重新呈現它所在的窗體。我不知道爲什麼這是行不通的。然而......我正在工作,現在已經完成了基本上完全按照您的建議進行測試的內容(在我看到您的評論之前)。我將編輯我的代碼以發佈解決方案。儘管第一種方法爲什麼不起作用? – twmb 2012-04-19 11:27:56