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