【问题标题】:How to reorder items in h:selectOneMenu depending on a condition如何根据条件重新排序 h:selectOneMenu 中的项目
【发布时间】:2013-02-28 09:27:37
【问题描述】:

我需要使用 h:selectOneMenu,它可以根据 bean 参数显示项目。 因此,如果用户具有“管理员”角色,则第一项应为“管理员”,第二项应为“用户”,反之亦然。 这是我的代码示例

<h:selectOneMenu id="role" value="#{adminBean.role}">
    <h:panelGroup rendered="#{adminBean.role == 'User'}" >
        <f:selectItem itemLabel="User" itemValue="User"/>
        <f:selectItem itemLabel="Admin" itemValue="Admin"/>
    </h:panelGroup>
    <h:panelGroup rendered="#{adminBean.role == 'Admin'}" >
        <f:selectItem itemLabel="Admin" itemValue="Admin"/>
        <f:selectItem itemLabel="User" itemValue="User"/>
    </h:panelGroup>
</h:selectOneMenu> 

但是这段代码根本不起作用,选择的列表是完全空的

【问题讨论】:

  • param 来自哪里?是地图吗?
  • 这是我的最终代码,但它不起作用。我只需要 2 个选项,但它显示 4 选择一个菜单>

标签: jsf jsf-2


【解决方案1】:

这是实现它的一种方法,使用两个f:selectItem 并根据条件交替它们的值

<h:selectOneMenu id="role" value="#{adminBean.role}">
    <f:selectItem itemLabel="#{(adminBean.role == 'User')?'User':'Admin'}" 
        itemValue="#{(adminBean.role == 'User')?'User':'Admin'}"/>
    <f:selectItem itemLabel="#{(adminBean.role == 'User')?'Admin':'User'}" 
        itemValue="#{(adminBean.role == 'User')?'Admin':'User'}"/>
</h:selectOneMenu> 

【讨论】:

    【解决方案2】:

    试试这个方法,希望有用

    <c:set var="role" value="${adminBean.role}"/>
     <c:choose><c:when test="${role eq "User" }" >
       <h:selectOneMenu id="role" value="#{adminBean.role}"  >
               <f:selectItem itemLabel="Admin" itemValue="Admin"/>
               <f:selectItem itemLabel="User" itemValue="User"/>
       </h:selectOneMenu>
    </c:when></c:choose>
    

    你可以为Admin添加类似的条件

    【讨论】:

      【解决方案3】:

      PostConstruct 解决方案

      <f:selectItems value="#{adminBean.options}">
      

      .

      @PostConstruct
      public void postConstruct(){
          this.role = loggedInUser.getRole();
          this.options = service.getOptionsByRole(role);
      }
      
      public List<SelectItem> getOptions() {
          return options;
      }
      

      单行 if-else 语句解决方案

      <f:selectItems value="#{adminBean.role == 'User' ? adminBean.userOptions : adminBean.adminOptions}">
      

      参数传递解决方案

      <f:selectItems value="#{adminBean.getOptionsByRole(adminBean.role)">
      

      .

      public List<SelectItem> getOptions(String role) {
      
          if (role.equals("User")) {
              return userOptions;
          }
      
          return adminOptions;
      }
      

      条件式 getter 方法(不推荐)

      <f:selectItems value="#{adminBean.options">
      

      .

      public List<SelectItem> getOptions() {
      
          if (role.equals("User")) {
              return userOptions;
          }
      
          return adminOptions;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-02-01
        • 2019-01-24
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 2021-04-30
        相关资源
        最近更新 更多