如何根据条件重新排序h:selectOneMenu中的项目

时间:2013-02-28 09:27:37

标签: jsf jsf-2

我需要使用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> 

但是,此代码根本不起作用,所选列表完全为空

3 个答案:

答案 0 :(得分: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> 

答案 1 :(得分:0)

尝试这种方式,希望它有效

<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

添加类似的条件

答案 2 :(得分:0)

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;
}

Conditinal getter方法(不推荐)

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

public List<SelectItem> getOptions() {

    if (role.equals("User")) {
        return userOptions;
    }

    return adminOptions;
}