我有一个包含多个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>
它会在primefaces和ajax监听器中没有任何问题吗?
答案 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 />