gpt4 book ai didi

jsf - Primefaces 依赖 selectOneMenu 且必需 ="true"

转载 作者:行者123 更新时间:2023-12-02 18:31:37 36 4
gpt4 key购买 nike

在我的应用程序中,我有三个下拉菜单( p:selectOneMenu ),例如 A、B、C。其中两个是相关的,例如 B 和 C。通过更改 B 的值,我可以动态地将值加载到 C。是一个文本框。当 on-change 事件从这三个下拉列表中触发时,文本框的值由 ajax 生成。

这是 xhtml:

<p:selectOneMenu id="customerMenu" value="#{adminController.activityDTO.customerId}" required="true" label="Customer Name" style="width: 200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{adminController.customers}" var="customer" itemLabel="#{customer.customerName}" itemValue="#{customer.customerId}" />
<p:ajax listener="#{adminController.generateActivityName}" update="activityId" />
</p:selectOneMenu>

<p:selectOneMenu id="activityTypeMenu" value="#{adminController.activityDTO.activityParentType}" required="true" label="Activity Type"
style="width: 200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{adminController.activityTypes}" var="activityType" itemLabel="#{activityType.parent}" itemValue="#{activityType.parent}" />
<p:ajax listener="#{adminController.updateDependentActivity}" update="activitySubType" />
</p:selectOneMenu>

<p:selectOneMenu id="activitySubTypeMenu" value="#{adminController.activityDTO.activitySubType}" required="true" label="Activity Sub Type"
style="width: 200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{adminController.activitySubTypes}" var="activityType" itemLabel="#{activityType.name}" itemValue="#{activityType.id}" />
<p:ajax listener="#{adminController.generateActivityId}" update="activityId" />
</p:selectOneMenu>

<p:inputText id="activityId" autocomplete="off" readonly="true" value="#{adminController.activityDTO.activityId}"
label="#{adbBundle['admin.addActivityPanel.addActivityTable.activityId']}" required="true" />

activityTypeMenuactivitySubTypeMenu取决于 activityTypeMenu 的选定值我正在填充 activitySubTypeMenu .

现在我面临的问题是:

  • 假设我在 activityTypeMenu 中选择了“外部”和“内部”并默认“选择一个”。如果我从activityTypeMenu中选择“外部” activitySubTypeMenu将有“项目”和“服务”。但是如果我选择默认的“选择一个”activitySubTypeMenu仍然保留之前动态填充的值。这是因为required="true"属性阻止触发我从中加载动态值的后端方法。
  • 我尝试设置 itemValue<f:selectItem itemLabel="Select One" itemValue="" />#{null}然后后端方法在选择“选择一个”选项时触发,我可以将空列表设置为 activitySubTypes这样 activitySubTypeMenu变空。但在这种情况下 required="true"变得毫无意义。我的意思是,我还有保存按钮,然后单击该按钮而不选择 activityTypeMenu 中的任何选项(即选择“选择一个”)。和activitySubTypeMenu不扔ValidatorException并且组件未通过 Primefaces 的错误 css 类设置样式。
  • 此外,如果我不设置 itemValue<f:selectItem itemLabel="Select One" itemValue="" />#{null}然后将所选值更改为默认选项(“选择一个”)不会清除 activityId p:inputText 。如果我使用 #{null}然后我可以触发后端方法,从中我可以将文本框的值设置为空。

我如何解决这个问题并获得想要的结果。我想要的是:

  • 如果该选项设置为“选择一个”,则相关菜单和文本框的菜单将为空。
  • 我想使用 required="true"属性。

最佳答案

您可以在 required 属性中使用 EL。仅当按下特定提交按钮或提交特定组件值时(因此通过请求参数映射中存在其客户端 ID),您才可以让所需表达式计算 true #{参数})。

以下启动示例应该可以满足您的需要。

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

这样,仅当按下表单的主提交按钮时才需要第一个菜单(因此在事件监听器被触发时不需要),并且仅当第一个菜单具有值时才需要第二个菜单。

关于jsf - Primefaces 依赖 selectOneMenu 且必需 ="true",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14537567/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com