2012-12-10 46 views
1

是否可以用布爾型EL表達式填充required屬性的值? 我有一個表格,其中僅當說明輸入(descInput)不爲空時,才需要輸入數量(qtyInput)。我試圖這樣做:必填屬性中的布爾表達式

<h:form id="form"> 
     <p:dataTable var="item" value="#{someController.list}" id="table"> 
      <p:column> 
       <f:facet name="header" > 
        <h:outputText value="Description"/> 
       </f:facet> 
       <p:inputText value="#item.description}" id="descInput" /> 
       <p:message for="descInput" /> 
      </p:column> 
      <p:column> 
       <f:facet name="header" > 
        <h:outputText value="Quantity"/> 
       </f:facet> 
       <p:inputText value="#{item.quantity}" required="#{not empty item.description}" id="qtyInput"/> 
       <p:message for="qtyInput" /> 
      </p:column> 

     </p:dataTable> 
     <p:commandButton id="saveButton" value="Save" action="#{someController.save()}"/> 
</h:form> 

但它沒有工作。是否有可能只與EL做到這一點,或者我應該實現定製驗證器?

回答

1

是的,這是可能的。你的問題只是由錯誤的時機造成的。在當前的嘗試,

<p:inputText ... value="#{item.description}" /> 
<p:inputText ... value="#{item.quantity}" required="#{not empty item.description}" /> 

#{item.description}期間更新模型值階段只設,而required屬性在驗證階段,這是前一階段評估。因此,您正在檢查當時尚未提供的價值。

您需要檢查組件的值而不是模型值。您可以通過將組件綁定到視圖然後訪問UIInput#getValue()來獲取它。

<p:inputText ... binding="#{descComponent}" value="#{item.description}" /> 
<p:inputText ... value="#{item.quantity}" required="#{not empty descComponent.value}" /> 

注意,組件在它們出現在組件樹的順序進行處理,所以如果你有上述部件倒過來,那麼它就會失敗也是如此。您需要通過UIInput#getSubmittedValue()來檢查組件的提交值。

<p:inputText ... value="#{item.quantity}" required="#{not empty descComponent.submittedValue}" /> 
<p:inputText ... binding="#{descComponent}" value="#{item.description}" /> 
+0

正如你所說,這是(我的理解)JSF lificycle的問題。謝謝。 – Milan

+0

不客氣。 – BalusC

0

什麼BalusC寫是使用PrimeFaces的替代號碼:AJAX

<p:inputText ...id="itemDescription" value="#{item.description}"> 
    <p:ajax event="blur" partialSubmit="true" update="itemQuantity" /> 
</input> 
<p:inputText ...id="itemQuantity" value="#{item.quantity}" required="#{not empty item.description}" /> 

它看起來在我看來優雅,唯一不足的是,無論是在itemQuantity輸入,它會在itemDescription修改後重新設置爲bean的值(如果是這種情況,則爲no-value)。 也許你可以使用BalusC的庫omnifaces,它提供了一些validateAllOrNone驗證,雖然我從來沒有使用過。

Eduard

+0

OmniFaces並未爲此提供解決方案。 OP的方法很好。 – BalusC