在PrimeFaces 3.4 JSF 2.0中按id查找组件

时间:2015-05-05 14:32:41

标签: jsf jsf-2 primefaces

我想要一个在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];

}

1 个答案:

答案 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;
}