在我的应用程序中,我有三个下拉菜单(p:selectOneMenu
),比如A,B,C。其中两个是依赖的,比如说B和C.通过改变BI的值,我动态地将值加载到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" />
activityTypeMenu
和activitySubTypeMenu
依赖于我填充activityTypeMenu
的{{1}}的选定值。
现在我遇到的问题是:
activitySubTypeMenu
中选择了“外部”和“内部”,默认为“选择一个”。如果我从activityTypeMenu
选择“外部”,则activityTypeMenu
将具有“项目”和“服务”。但是如果我选择默认的“选择一个”,activitySubTypeMenu
仍然保留以前动态填充的值。这是因为activitySubTypeMenu
属性拒绝触发我正在加载动态值的后端方法。required="true"
itemValue
设置为<f:selectItem itemLabel="Select One" itemValue="" />
,然后后端方法在选择“选择一个”选项时触发,我可以将空列表设置为{ {1}}这样#{null}
变空了。但在这种情况下,activitySubTypes
变得毫无意义。我的意思是,我也有保存按钮,点击该按钮时没有选择任何选项(即选择“选择一个”)来自activitySubTypeMenu
而required="true"
没有投掷activityTypeMenu
且组件不是由Primefaces的错误css类设置样式。activitySubTypeMenu
ValidatorException
设置为itemValue
,那么将所选值更改为默认选项(“选择一个”)并不会清除{ {1}} <f:selectItem itemLabel="Select One" itemValue="" />
。如果我使用#{null}
,那么我可以启动后端方法,我可以将文本框的值设置为空。我如何解决这个问题并获得理想的结果。我想要的是:
activityId
属性。答案 0 :(得分:10)
您可以在required
属性中使用EL。只有在按下特定的提交按钮时,或者在提交特定组件值时(并且因此通过请求参数映射true
中存在的客户端ID),您才能让所需的表达式评估#{param}
。 / p>
以下启动示例应该做你需要的。
<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}" ... />
这样,只有在按下表单的主提交按钮时才需要第一个菜单(因此当事件监听器被触发时不需要),只有当第一个菜单有值时才需要第二个菜单。