我有一个包含多个h:selectOneMenu
或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>
它在素数和 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" />