条件渲染f:selectItem可能存在的问题

时间:2013-01-25 15:41:58

标签: jsf jsf-2 selectonemenu rendered-attribute

我有一个包含多个h:selectOneMenup:selectOneMenu的网页,我想使用同一页面进行编辑和添加数据。 当我编辑数据时,我需要f:selectItem。我知道这个组件没有渲染属性。我读到我可以使用<c:if>

确定。例如,如果我写

<p:selectOneMenu rendered="#{not empty bean.id}"
    value="#{bean.selectedId}">
    <c:if test="${editableBean != null}">
        <f:selectItem itemLable="#{editableBean.name} itemValue=#{editableBean.id} />
    </c:if>
    <f:selectItems value="#{bean.listItems}" var="item"
        itemLabel="#{item.name}" itemValue="#{item.id}"/>
</p:selectOneMenu>

它会在primefaces和ajax监听器中没有任何问题吗?

1 个答案:

答案 0 :(得分:4)

简单的解决方案(但性能较差)将在托管bean中具有boolean editMode属性以启用/禁用组件。基本示例:

<p:selectOneMenu rendered="#{not empty bean.id}" disabled="#{bean.editMode}"
    value="#{bean.selectedId}">
    <f:selectItems value="#{bean.listItems}" var="item"
        itemLabel="#{item.name}" itemValue="#{item.id}"/>
</p:selectOneMenu>

在你的bean中

@ManagedBean
@ViewScoped
public class Bean {

    private int id;
    private boolean editMode;
    //other attributes...
    //getters and setters...

    @PostConstruct
    public void init() {
        //a way to know if the bean it's in edit mode
        editMode = (id != 0);
    }
}

此解决方案性能较差,因为每个<p:selectOneMenu>都必须加载所有数据,然后选择实际值,但它会执行您想要的操作。另一个选项是将此属性用于rendered的{​​{1}}属性和<p:selectOneMenu>(或者<h:inputText disabled="true" readonly="true" />)。另一个基本样本:

<h:outputText />