Tap*_*ose 7 jsf selectonemenu primefaces jsf-2
在我的应用程序中,我有三个下拉菜单(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" />
Run Code Online (Sandbox Code Playgroud)
在activityTypeMenu和activitySubTypeMenu依赖,由所选择的值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"属性.Bal*_*usC 10
您可以在required属性中使用EL .true只有在按下特定的提交按钮时,或者在提交特定组件值时(并且因此通过请求参数映射中存在的客户端ID),才能评估所需的表达式#{param}.
以下启动示例应该满足您的需求.
<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}" ... />
Run Code Online (Sandbox Code Playgroud)
这样,只有当按下表单的主提交按钮时才需要第一个菜单(因此当事件监听器被触发时不需要),只有当第一个菜单有值时才需要第二个菜单.
| 归档时间: |
|
| 查看次数: |
17078 次 |
| 最近记录: |