2013-11-28 26 views
3

這裏是我的配置:如何在p:ajax event = change時禁用selectOneMenu上的必需標記?

  • PrimeFaces:4.0.4(精英)
  • OmniFaces:1.6.3
  • JSF:MyFaces的2.0.2
  • 服務器:8.5.0.2的WebSphere

一些代碼(我只張貼更多,更清晰的相關部分):

<p:selectOneMenu value="#{viewModel.selectedContact}" required="true" converter="omnifaces.SelectItemsConverter"> 
    <p:ajax event="change" listener="#{viewModel.updateContact}" update="area"/> 
    <f:selectItem itemValue="#{null}" itemLabel="#{msg.no_contact}" noSelectionOption="true" /> 
    <f:selectItems value="#{viewModel.contacts}"/> 
</p:selectOneMenu> 

所以在這裏,我們有一個簡單的p:selectOneMenu,它包含一個Contact對象列表以及一個「無接觸」選項。如果我想提交表單,這個字段是必需的。

當在列表中選擇一個聯繫人時,將調用updateContact方法。此方法將生成將顯示在由AJAX調用更新的頁面的area部分中的數據。

如果我選擇「無聯繫人」選項,由於此字段是必需的,因此會觸發驗證錯誤,因此不會調用updateContact方法。我想調用該方法,因爲我需要重置一些數據,然後隱藏頁面的area部分。

我試過使用process="@this",immediate="true",但它不起作用。使用immediate="true",所選的Contact未傳遞給updateContact方法。

那麼,選擇空值時繞過此字段驗證的最佳方法是什麼?

回答

7

required屬性檢查命令按鈕是否被調用。您可以通過請求參數映射中按鈕的客戶端ID進行檢查。

<p:selectOneMenu ... required="#{not empty param[save.clientId]}" /> 
... 
<p:commandButton binding="#{save}" ... /> 

(注:代碼是按原樣,你不需要爲這個bean屬性)

如果命令按鈕,則不會調用(而是阿賈克斯更改偵聽器調用) ,那麼required屬性將評估false,一切都會隨着你的意圖而變。


更新:根據意見,你打算讓他們看起來像需要在渲染響應所有的時間。因此,只需添加該檢查:

<p:selectOneMenu ... required="#{not empty param[save.clientId] or facesContext.currentPhaseId.ordinal eq 6}" /> 
... 
<p:commandButton binding="#{save}" ... /> 
+0

您建議的是一個很好的解決方案。不過,我有一句話。我在窗體上的所有必填字段都有一個帶有'for'屬性的關聯'p:outputLabel'。這意味着他們會在旁邊顯示一個小星星(*),向用戶顯示這些字段是必需的。如果我使用您的解決方案,那些星星不再顯示。用戶只有在提交表單後纔會看到它們。 – Nasedo47

+0

查看更新的答案。 – BalusC

+0

太棒了!非常感謝你!正是我需要的。 – Nasedo47

相關問題