3

我有一个包含多个h:selectOneMenuor的页面p: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 监听器中正常工作吗?

4

1 回答 1

4

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

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

在你的豆子里

@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(或可能)。另一个基本示例:<p:selectOneMenu><h:inputText disabled="true" readonly="true" /><h:outputText />

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

<h:inputText rendered="#{bean.editMode}" value="{bean.selectedText}"
    disabled="true" readonly="true" />
于 2013-01-25T15:53:59.593 回答