仅当辅助 bean 中的所述值为 null 时,如何在 p:SelectOneMenu 中显示 null 值?

How to show null value in p:SelectOneMenu ONLY when said value is null in the backing bean?

这是我的 selectOneMenu:

<h:form>
    <p:selectOneMenu id="handlerSelect" value="#{caseController.case.handler}" 
        converter="omnifaces.SelectItemsIndexConverter" style="width:182px">
        <f:selectItems value="#{handlerController.findAllHandlers()}"
            var="handlerSelect" itemLabel="#{handlerSelect.name}"
            itemValue="#{handlerSelect}" />
        <p:ajax event="change"listener="#{caseController.changeHandler}" update="handlerSelect"/>
    </p:selectOneMenu>
</h:form>

当用户打开视图时,此 selectOneMenu 中显示的默认值是用户打开案例的处理人员的姓名。现在,有些情况下 null 作为数据库中的值。在这些情况下,该值是处理程序列表中第一个处理程序人员的姓名。这显然是错误的,因为显示的值不应该是处理者的姓名,因为所讨论的案例没有处理者,而是案例行的处理者列中的空值。

现在,我该如何显示一些自定义文本,例如。 "Choose handler" 当处理程序 属性 在案例对象上 null 时?

要显示一个特殊的 "Choose handler" 选项,如果您的值为 null,只需添加一个额外的

<f:selectItem
  itemLabel="Choose handler"
  itemValue="#{null}"
/>

到您的 selectOneMenu。

要显示此特殊选项,仅当您的值为 null 时,您可以添加几乎完全相同的第二个 selectOneMenu 但没有特殊选项,并为它们提供相反的渲染属性。由此产生的 id 问题可以通过将 selectOneMenus 括起来来解决,例如<p:outputPanel /> 具有原始 id 属性。

<h:form>
  <p:outputPanel id="handlerSelect">
    <p:selectOneMenu
      value="#{caseController.case.handler}" 
      converter="omnifaces.SelectItemsIndexConverter"
      style="width:182px"
      rendered="#{caseController.case.handler eq null}"
    >
      <f:selectItem
        itemLabel="Choose handler"
        itemValue="#{null}"
      />
      <f:selectItems 
        value="#{handlerController.findAllHandlers()}"
        var="handlerSelect"
        itemLabel="#{handlerSelect.name}"
        itemValue="#{handlerSelect}"
      />
      <p:ajax
        event="change"
        listener="#{caseController.changeHandler}"
        update="handlerSelect"
      />
    </p:selectOneMenu>
    <p:selectOneMenu
      value="#{caseController.case.handler}" 
      converter="omnifaces.SelectItemsIndexConverter"
      style="width:182px"
      rendered="#{caseController.case.handler ne null}"
    >
      <f:selectItems 
        value="#{handlerController.findAllHandlers()}"
        var="handlerSelect"
        itemLabel="#{handlerSelect.name}"
        itemValue="#{handlerSelect}"
      />
      <p:ajax
        event="change"
        listener="#{caseController.changeHandler}"
        update="handlerSelect"
      />
    </p:selectOneMenu>
  </p:outputPanel>
</h:form>