当p:ajax event = change时,如何在selectOneMenu上禁用所需的标记?

时间:2013-11-28 10:12:31

标签: ajax jsf primefaces selectonemenu required

这是我的配置:

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

一些代码(我只发布了相关部分以便更清晰):

<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部分中的数据。

如果选择“No Contact”选项,则会触发验证错误,因为此字段是必需的,因此不会调用updateContact方法。我希望调用该方法,因为我需要重置一些数据,然后隐藏页面的area部分。

我尝试使用process="@this"immediate="true",但它不起作用。使用immediate="true"时,选定的Contact不会传递给updateContact方法。

那么,选择空值时绕过此字段验证的最佳方法是什么?

1 个答案:

答案 0 :(得分:8)

required属性检查是否调用了命令按钮。您可以通过请求参数映射中存在按钮的客户端ID来检查它。

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

(注意:代码是原样,你不需要bean属性)

如果未调用命令按钮(而是调用ajax更改侦听器),则required属性将评估false,一切都将按照您的意图进行。


更新:根据评论,您打算在渲染响应期间始终显示它们。所以,只需添加该检查:

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