Primefaces依赖selectOneMenu用于和所需=“真”(Primefaces depe

2019-07-18 18:32发布

在我的应用我有三个下拉菜单( p:selectOneMenu ),说A,B,C。其中两个是相关的,说B和C.通过改变BI正在动态加载值下的值来说也有一个文本框。 文本框的值由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和默认“选择之一”。 如果让我选择从“外部” activityTypeMenuactivitySubTypeMenu将有“项目”和“服务”。 不过,如果我选择默认的“选择之一”的activitySubTypeMenu仍持有先前动态填充值。 这是因为required="true"属性抵抗火后端方法从我加载的动态值。
  • 我试图设置itemValue<f:selectItem itemLabel="Select One" itemValue="" />#{null}然后后端方法烧制上选择“选择一个”选项,我可以设置空名单activitySubTypes和这样的activitySubTypeMenu得到空。 但是,在这种情况下, required="true"越来越没有意义。 我的意思是,我也有保存按钮,在单击该按钮没有选择任何选项(即选择“选择一个”)从activityTypeMenuactivitySubTypeMenu不扔ValidatorException和部件没有得到由错误的CSS类Primefaces的风格。
  • 另外,如果我不设置itemValue<f:selectItem itemLabel="Select One" itemValue="" />#{null}然后改变到选定的值默认选项(“选择一个”)不清除出activityId p:inputText 。 如果我使用#{null}然后我可以从中我可以在文本框的值设置为空后端方法烧制。

我CA如何解决这个问题,并得到想要的结果。 我想主要有:

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

Answer 1:

您可以在使用EL required属性。 可以让所需的表达评估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}" ... />

这样一来,当按下窗体的主提交按钮(因此,不会在事件侦听器被解雇),当第一个菜单中有一个值的第二个菜单只需要只需要1号菜单。



文章来源: Primefaces dependent selectOneMenu and required=“true”