条件呈现 f:选择项可能的问题



我有一个包含多个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>

它在素数和 ajax 侦听器中会没有任何问题吗?

简单的解决方案(但性能较差)是在受管 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>

在你的豆子里

@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>都必须加载所有数据,然后选择实际值,但它会执行所需的操作。另一种选择是将此属性用于 <p:selectOneMenu>rendered 属性和 <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" />

相关内容

  • 没有找到相关文章