我想要一个在PrimeFaces 3.4中通过id找到UIComponent
的方法。
我已经找到了一种方法来执行此操作,但它有一个方法visitTree(在PrimeFaces 5.2中可用),PrimeFaces 3.4不可用。
请有人帮我在下面的XHTML中找到面板对象。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
<h:form id="form">
<p:panel id="pnl"><h:outputText value="Yahoooo...."></h:outputText></p:panel>
<p:commandButton ajax="false" value="Toggle" actionListener="#{myBean.mytoggle}"/>
</h:form>
</h:body>
</html>
Primefaces 5.2工作方法
public UIComponent findComponent(final String id) {
FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot root = context.getViewRoot();
final UIComponent[] found = new UIComponent[1];
root.visitTree(new FullVisitContext(context), new VisitCallback() {
@Override
public VisitResult visit(VisitContext context, UIComponent component) {
if(component.getId().equals(id)){
found[0] = component;
return VisitResult.COMPLETE;
}
return VisitResult.ACCEPT;
}
});
return found[0];
}
答案 0 :(得分:3)
UIComponent#visitTree()
方法并非针对任何PrimeFaces版本。它特定于JSF 2.0。它应该在JSF 2.x之上运行的任何PrimeFaces版本上同样有效。如果您实际运行JSF 1.x,它只会失败。
即便如此,标准JSF API已经为作业提供了UIViewRoot#findComponent()
,它只需要一个客户端ID,而不是一个组件ID。
UIViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
UIComponent component = view.findComponent("form:pnl");
// ...
尽管如此,这是您的问题的错误解决方案。您似乎有兴趣对其进行setRendered(boolean)
来电。你根本不应该这样做。你不应该对模型方面的观点感兴趣。反之亦然。您应该设置一个模型值,视图应该绑定到该模型值。
这是一个启动示例:
<h:form>
<p:panel rendered="#{not bean.hidden}">
<h:outputText value="Yahoooo...." />
</p:panel>
<p:commandButton value="Toggle" action="#{bean.toggle}" update="@form" />
</h:form>
在bean中只有这个:
private boolean hidden;
public void toggle() {
hidden = !hidden;
}
public boolean isHidden() {
return hidden;
}