2012-03-08 16 views
26

我有一個對話框內一種形式,我關閉通過點擊與阿賈克斯命令按鈕,如何找到一個驗證錯誤的指示(所需=「真」),而這樣做的AJAX命令

這樣

<h:commandButton value="Add" action="#{myBean.addSomething(false)}" 
    id="add_something_id" > 
    <f:ajax render="@form someTable" execute="@form" 
     onevent="closeAddNewSomethingDialogIfSucceeded"></f:ajax> 
</h:commandButton> 

這裏是關閉該對話框

function closeAddNewSomethingDialogIfSucceeded(data) { 
     if(data.status === 'success') { 
      $("#dialog_id").dialog("close"); 
     } 
    } 

沒有問題,到這裏的js代碼...

現在我改變了一些對話形式的場爲required="true",現在我想阻止我得到驗證錯誤對話框關閉...

但AJAX data.status仍然達到success狀態,我不能弄清楚什麼跡象表明驗證失敗,我可以掛鉤...

任何想法?

感謝BalusC答案,我做了以下內容:

在JSF

,補充說:

<h:panelGroup id="global_flag_validation_failed_render"> 
     <h:outputText id="global_flag_validation_failed" value="true" 
      rendered="#{facesContext.validationFailed}"/> 
    </h:panelGroup> 

的F:AJAX改爲

<f:ajax render="@form someTable global_flag_validation_failed_render" 

和JS加以下檢查

if(data.status === 'success') { 
    if($("#global_flag_validation_failed").length === 0){ 
     $("#dialog_id").dialog("close"); 
    } 
} 

回答

49

不是專門針對required="true",但是您可以通過#{facesContext.validationFailed}進行檢查,如果驗證一般失敗。如果你把這個有如果有問題的按鈕被#{not empty param[buttonClientId]}按下檢查,那麼你可以把它一起在<h:outputScript>rendered屬性如下:

<h:commandButton id="add_something_id" binding="#{add}" value="Add" action="#{myBean.addSomething(false)}"> 
    <f:ajax execute="@form" render="@form someTable" /> 
</h:commandButton> 
<h:outputScript rendered="#{not empty param[add.clientId] and not facesContext.validationFailed}"> 
    $("#dialog_id").dialog("close"); 
</h:outputScript> 

(請注意,你需要確保的是,腳本也用f重新渲染:AJAX)

有點哈克,但它無法處理它在onevent功能爲標準JSF實現不提供關於Ajax響應驗證狀態的任何信息。

如果您碰巧使用RichFaces,那麼您可以在<a4j:xxx>命令按鈕/鏈接的oncomplete屬性中使用EL。他們在每個請求的基礎,即評估,而不是對每個視圖基礎作爲標準JSF和PrimeFaces:

<a4j:commandButton ... oncomplete="if (#{!facesContext.validationFailed}) $('#dialog_id').dialog('close')" /> 

或者,如果你碰巧使用PrimeFaces,那麼你可以採取的事實,即PrimeFaces延伸具有額外args.validationFailed屬性Ajax響應其在oncomplete屬性的JavaScript的範圍直注入:

<p:commandButton ... oncomplete="if (args &amp;&amp; !args.validationFailed) $('#dialog_id').dialog('close')" /> 

(注意&amp;是被用來代替&,因爲&是一個特殊的CHARACT呃在XML/XHTML中)

或者您可以在bean的action方法中使用PrimeFaces的RequestContext API以編程方式在渲染視圖中執行JavaScript。

RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')"); 

沒有條件檢查是必要的,因爲當驗證失敗時,bean的操作方法不會被調用。

+0

謝謝!最終我使用#{facesContext.validationFailed}(我沒有意識到)我使用它在一個簡單的outputext渲染條件...後來在js代碼我檢查使用jQuery的outputtext存在.length ... – Daniel 2012-03-11 08:18:37

+0

不客氣。有關JSF中隱式EL對象的概述,另請參閱[this](http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ImplicitELObjects)。 – BalusC 2012-03-11 12:33:33

+1

@BalusC Does facesContext.validationFailed是否也適用於轉換失敗?如果轉換失敗,這是真的嗎? – Bren 2013-10-30 22:32:45

2

我想你應該看看PrimeFaces'RequestContext。這可以幫助您觸發服務器端的客戶端代碼。

2

兩件事 1)在「一個OnEvent」功能

你一定會爲必填字段的消息標記檢查錯誤?

<h:message id="m-my-field-id" for="my-field-id" errorClass="error-class"/> 

所以,你可以檢查錯誤級類似

var message = $('#m-my-field-id'); 

if(message.hasClass('error-class'){ 
    //do this 
} 
else{ 
    //do that 
} 

2)DOM是不是最新的成功

是的,我可以看到的消息頁面在Firefox中,但jQuery告訴我它不在那裏。

我發現,用盡可能小的超時足以解決這個

setTimeout(
    function(){ 
    setErrorStyle(source.attr('id')); 
    }, 
    1 
); 
相關問題