2013-10-11 18 views
0

我有一個帶有輸入字段和保存按鈕的jsf表單,如下面的代碼所示。我想實現的是,當點擊保存按鈕時,輸入應該用正則表達式來驗證。如果驗證失敗,則不應顯示保存確認對話框。否則顯示一個保存確認對話框,讓用戶選擇是否保存。<p:commandButton CONDITIONAL onclick事件

在下面的代碼中,儘管出現了條件onclick =「if(#{conditionOK}),但總是顯示對話框,當條件OK返回false時,我不需要確認對話框。我認爲facescontext.isValidateFailed()將不會被重新evalutated。

請幫助:(

所有我想要什麼,只是要檢查,如果正則表達式,驗證返回true。對於這種情況下,應該顯示確認對話框

我的方法可能是錯誤的,很多謝謝你們如果還有其他解決方案

<h:form id="save_all_form"> 
     <p:inputTextarea rows="1" style="width:100%;resize:none" 
     value="#{cusBean.saveAll}" autoResize="false" 
     validatorMessage="Wrong format"> 
     <f:validateRegex pattern="#{msgs.pattern}" /> 
     </p:inputTextarea> 

     <ui:param name="conditionOK" 
     value="#{facesContext.postback and !facesContext.validationFailed}" /> 

     <p:commandButton value="#{msgs.button_overwrite_all}" 
     onclick="if(#{conditionOK}){confirmation.show()}"/> 
</h:form> 
+0

所以當頁面被渲染並且用戶在textarea中輸入了一些不能通過驗證的東西時,你想顯示確認對話框?請詳細解釋一下這個過程。 – user1983983

+0

我已更新我的問題。它討厭有人編輯了這個問題。 –

回答

0

我不認爲JSF驗證是適合您的方式。這是爲了防止案例中模型數據的變化,即驗證失敗。
如果您想在JavaScript中進行檢查,則必須更新HTML中的部分。 JavaScript不會重新評估Expression,因此每次都會使用第一次呈現視圖時的值。

嘗試在XHTML如下:

<h:form id="save_all_form"> 
    <p:inputTextarea id="input" rows="1" style="width:100%;resize:none" 
    value="#{cusBean.saveAll}" autoResize="false"> 
    <p:ajax global="false" update="input submit" partialSubmit="true"/> 
    </p:inputTextarea> 

    <p:commandButton id="submit" value="#{msgs.button_overwrite_all}" 
    onclick="if(#{cusBean.validate(msgs.pattern)}){confirmation.show()}"/> 
</h:form> 

而且在CusBean添加這個方法:

public boolean validate(String pattern) { 
    return getSaveAll().matches(pattern); 
} 

其結果將是,不存在JSF驗證其發生和價值每次更改textArea時都會提交。再加上命令按鈕部分更新,以便條件得到更新。

+0

你的意思是,facescontext.validateFailed是一個Javascript調用?不是。正如在[本文]中提到的(http://stackoverflow.com/questions/6434866/defining-and-reusing-variable-in-jsf-page)ui:param將在每次使用該值時重新評估。 –

+0

這與我所說的完全相反,我說'if(#{conditionOK}){confirmation.show()}'是一個JavaScript調用,並且您從不更新commandButton,'#{conditionOK}'將會始終是「真」的初始值。表達式僅在視圖渲染時進行評估。 – user1983983

+0

謝謝你提示commandButton沒有更新! –

0

像其他答案一樣解釋onclick由於請求尚未提交,因此檢查JSF請求的驗證狀態(使用!facesContext.validationFailed)爲時尚早;尚未運行驗證,因此在onclick期間,驗證狀態將始終爲假(有點類似)。

所以你想要做的就是進行實地的AJAX驗證(如顯示在前面的答案),然後使用primefaces args變量來檢查請求的狀態:

<p:commandButton value="#{msgs.button_overwrite_all}" id="createReport" onclick="if(!args.validationFailed){confirmation.show();}"/>